【问题标题】:Mysql. Duplicate autoincrement key in same tablemysql。在同一个表中重复的自动增量键
【发布时间】:2012-06-23 07:55:48
【问题描述】:

只有一张桌子。 Parent_id 引用相同的表 id。如果parent_id = id,如何插入raw?我不知道 id(插入前),如果没有 parent_id 则无法插入。 没有获得最后一个 INCREMENT id 并创建临时表的最佳方法是什么?

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) unsigned NOT NULL,
  `someotherfield` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY `constr_catalog_guid_id` (`parent_id`) REFERENCES `test` (`id`)   
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是行不通的:

Insert into 'test' values (parent_id = test.id, "NOt matter");

【问题讨论】:

  • 为什么要复制,没有父记录使用预定义值。
  • id 是自动增量,id 也是 primary key。你怎么能复制它们?解释一下!

标签: mysql foreign-keys auto-increment self-reference


【解决方案1】:
CREATE TRIGGER trigger_increment_id_for_another_field BEFORE INSERT ON test FOR EACH ROW
BEGIN
   DECLARE next_id INT;
   SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='test');
   SET NEW.parent_id=next_id;
END

此触发器应根据 auto_increment 值复制 parent_id 值,以便为每行插入。

【讨论】:

    【解决方案2】:

    您可以暂时禁用外键的执行,例如:

    SET foreign_key_checks = 0;
    INSERT INTO 'test' VALUES (NULL, NULL, "foo");
    UPDATE 'test' SET parent_id = id WHERE parent_id IS NULL;
    SET foreign_key_checks = 1;
    

    我不确定,但您可能需要让列允许 NULL 才能正常工作。

    http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks

    【讨论】:

    • 评估最后一个 INCREMENT id 可能更好?
    • 感谢您的评论,Ctrahey。我在触发器中完成了空值检查。
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多