【问题标题】:MySQL Primary Key as Foreign Key - Constraint errorMySQL主键作为外键 - 约束错误
【发布时间】:2015-10-18 05:48:46
【问题描述】:

假设我有这 3 张桌子。

CREATE TABLE IF NOT EXISTS GROUP ( 
           ID_GROUP INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
           GROUP VARCHAR(50) NOT NULL, 
           INDEX(GROUP) 
         ) ENGINE=INNODB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;)

CREATE TABLE IF NOT EXISTS USERZ (
            ID CHAR(8) NOT NULL, 
            GROUP VARCHAR(50) NOT NULL, 
            FIRST_NAME VARCHAR(100) NULL DEFAULT NULL , 
            LAST_NAME VARCHAR(100) NULL DEFAULT NULL, 
            DATE_CREATED TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
            PASSWORD VARCHAR(8) NULL DEFAULT 'HELLOWORLD', 
            PRIMARY KEY (ID), 
            INDEX (ID), 
            INDEX (GROUP), 
            FOREIGN KEY (GROUP) REFERENCES GROUP (GROUP) 
    ) ENGINE=INNODB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;)


CREATE TABLE IF NOT EXISTS WORKERS (   
          ID CHAR(8) NOT NULL PRIMARY KEY,   
          DATE_START TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,   
          DATE_END TIMESTAMP NULL,   
          FOREIGN KEY (ID) REFERENCES USERZ (ID)   
) ENGINE=INNODB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;)

我在表 USERZ 中插入数据没有问题。但是在向表 WORKERS 添加记录时,我收到错误消息:

mysql.connector.errors.IntegrityError: 1452 (23000): 无法添加或更新子行:外键约束失败 (DATABASENAME.WORKERS, CONSTRAINT WORKERS_ibfk_1 FOREIGN KEY (ID) 参考USERZ (ID))

我确定这是 WORKERS 主键 (ID) 指的是 USERZ (ID)。即使我知道 USERZ id 存在于 USERZ 中,它也不会让我向 WORKERS 添加数据。通过下面的例子,我知道 USERZ 表中存在“XXXXXXX1”,所以我想能够在 WORKERS 表中添加这个用户。

例如:

"INSERT INTO WORKERS (ID) VALUES ('XXXXXXX1') "

谢谢!

【问题讨论】:

  • 您也不应该将主键 ID 设为外键。向工人添加另一列 user_id 并且是您的外键

标签: python mysql sql python-3.x


【解决方案1】:

您也不应该将主键 ID 设为外键。重构它是这样的

CREATE TABLE IF NOT EXISTS WORKERS (   
          ID CHAR(8) NOT NULL PRIMARY KEY, 
          USER_ID CHAR(8) NOT NULL,
          DATE_START TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,   
          DATE_END TIMESTAMP NULL,   
          FOREIGN KEY (USER_ID) REFERENCES USERZ (ID)   
) ENGINE=INNODB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;)

然后你的插入应该是

INSERT INTO WORKERS (USER_ID) VALUES ('XXXXXXX1')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2023-03-13
    • 2018-02-15
    • 1970-01-01
    • 2011-01-23
    • 2012-01-16
    • 2011-06-12
    相关资源
    最近更新 更多