Как интерпретировать вывод mysqldump? - PullRequest
0 голосов
/ 23 февраля 2019

Мое намерение состоит в том, чтобы извлечь триггеры, функции и хранимые процедуры из базы данных, отредактировать их и добавить их в другую базу данных.

Ниже приведен частичный вывод mysqldump.Я понимаю, как база данных обновляется с помощью операторов DROP, CREATE и INSERT INTO, но не понимаю триггеров.Я ожидал следующего:

CREATE TRIGGER users_BINS BEFORE INSERT ON users
FOR EACH ROW
if(IFNULL(NEW.idPublic, 0) = 0) THEN
   INSERT INTO _inc_accounts (type, accountsId, idPublic) values ("users",NEW.accountsId,1)
   ON DUPLICATE KEY UPDATE idPublic = idPublic + 1;
   SET NEW.idPublic=(SELECT idPublic FROM _inc_accounts WHERE accountsId=NEW.accountsId AND type="users");
END IF;

Что означает /*!50003?Я думал, что это был какой-то комментарий, который означал бы, что CREATE для триггера нет, но я, должно быть, неверно истолковал вывод.Как следует интерпретировать вывод mysqldump?

mysqldump -u username-ppassword --routines mydb

--
-- Table structure for table `users`
--

DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idPublic` int(11) NOT NULL,
  `accountsId` int(11) NOT NULL,
  `firstname` varchar(45) NOT NULL,
  `lastname` varchar(45) NOT NULL,
  `email` varchar(45) NOT NULL,
  `username` varchar(45) NOT NULL,
  `password` char(255) NOT NULL COMMENT 'Password currently uses bcrypt and only requires 60 characters, but may change over time.',
  `tsCreated` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `osTicketId` int(11) NOT NULL,
  `phone` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniqueEmail` (`accountsId`,`email`),
  UNIQUE KEY `uniqueUsername` (`accountsId`,`username`),
  KEY `fk_users_accounts1_idx` (`accountsId`),
  CONSTRAINT `fk_users_accounts1` FOREIGN KEY (`accountsId`) REFERENCES `accounts` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `users`
--

LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (xxx
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`michael`@`12.34.56.78`*/ /*!50003 TRIGGER `users_BINS` BEFORE INSERT ON `users` FOR EACH ROW
BEGIN
if(IFNULL(NEW.idPublic, 0) = 0) THEN
   INSERT INTO _inc_accounts (type, accountsId, idPublic) values ("users",NEW.accountsId,1)
   ON DUPLICATE KEY UPDATE idPublic = idPublic + 1;
   SET NEW.idPublic=(SELECT idPublic FROM _inc_accounts WHERE accountsId=NEW.accountsId AND type="users");
END IF;
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

1 Ответ

0 голосов
/ 05 марта 2019
/* ... */ 

- это комментарий, который может быть частью строки или занимать много строк.

-- ...

- это комментарий, который заканчивается в конце строки.

/*!40000 ALTER TABLE `users` DISABLE KEYS */;

это специальный комментарий, который является комментарием, если выполняется сервером с версией ниже 4.00.00.Для 4.0.0 или новее это ALTER.(Не должно иметь значения, находится ли ; внутри специального комментария.)

DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`michael`@`12.34.56.78`*/ /*!50003 TRIGGER `users_BINS` BEFORE INSERT ON `users` FOR EACH ROW
BEGIN
    ...
END */;;
DELIMITER ;

Отделение этого друг от друга ...

DELIMITER ;;   -- Change the statement terminator
;;             -- finally terminate the "one" statement, namely the entire trigger
DELIMITER ;    -- change there terminator back

/*!50003 CREATE*/   -- same as  CREATE  for >= 5.0.3

/*!50017 DEFINER=`...`*/  -- same as  DEFINER=`...`  for >= 5.0.17

/*!50003 TRIGGER `users_BINS` BEFORE INSERT ON `users` FOR EACH ROW
BEGIN
    ...
END */   -- again, >= 5.0.3

Триггеры появились в 5.0.3;предложение DEFINER было добавлено в 5.0.17.

Если вы собираетесь редактировать текст, вы можете либо удалить /*!50017 и */ и предположить, что ваша версия достаточно новая, либо вы можете оставитьони на месте и работают вокруг них.Делайте все, что удобно для вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...