【问题标题】:2 foreign key references for a single primary key单个主键的 2 个外键引用
【发布时间】:2015-08-11 12:55:05
【问题描述】:

我有 3 个表:协议、用户、电子邮件,如下所示,用户表中的 id 作为电子邮件表 (id(FK)) 和协议表 id_two(FK) 中的外键。

我已成功使用以下代码将 emails 表中的 id(Foriegn Key) 引用到用户表中的 id(Primary key):

ALTER TABLE emails MODIFY COLUMN id INT NOT NULL,
 ADD CONSTRAINT id
 FOREIGN KEY(id)
 REFERENCES user(id);

但我收到错误 #1022 - 无法写入;表'#sql-13f0_30e'中的重复键

当我执行以下查询以将协议表的 id_two 引用到用户表的 id(PK) 时。

ALTER TABLE agreement MODIFY COLUMN id_two INT NOT NULL,
 ADD CONSTRAINT id_two
 FOREIGN KEY(id_two)
 REFERENCES user(id);

【问题讨论】:

标签: php mysql database codeigniter


【解决方案1】:

这很可能是因为您已经在名为id_twoagreement 表中定义了一个约束。更改约束的名称并查看

ALTER TABLE agreement MODIFY COLUMN id_two INT NOT NULL,
 ADD CONSTRAINT id_FK2
 FOREIGN KEY(id_two)
 REFERENCES user(id); 

【讨论】:

  • 现在它给出了这个错误:#1452 - 无法添加或更新子行:外键约束失败(nda.#sql-13f0_32a,CONSTRAINT id_FK2 FOREIGN KEY (id_two)参考user (id))
  • 这是因为您正在尝试添加/更新用户表中不存在的键值。确保先插入主表,然后插入子表。
【解决方案2】:

主键是唯一标识一行的一列或一组列。每个表都应该有一个主键。而且一张表不能有多个主键。

外键是一个表中的一列或一组列,其值必须与另一个(或同一个)表的主键中的值匹配。外键被称为引用它的主键。外键是一种维护数据完整性的机制。

对于您的问题,我已经为您创建了脚本。我是从头开始做的,因为在添加约束之前我需要有可用的表,但我没有添加所有列,抱歉!!:

--Create user table and add id as primary key

    CREATE TABLE user
    ( 
      Id Number (5) ,
      Username Varchar2 (25),
      Eamil Varchar2 (25),
       CONSTRAINT user_pk PRIMARY KEY (id)
    );

--Create "agreement" table and add "Agreement_Id" as primary key

    CREATE TABLE agreement
    ( 
      Id_Two Number (5) ,
      Agreement_Id Varchar2 (25),
      type Varchar2 (25),
       Constraint agreement_Pk Primary Key (agreement_id)
    );

--Create "email" table and add "email_Id" as primary key


    CREATE TABLE email
    ( 
      Id Number (5) ,
      Agreement_Id Varchar2 (25),
      Eamil_Id Varchar2 (25),
       Constraint email_Pk Primary Key (Eamil_Id)
    );

Now added constraints:

1. Foriegn key for "Agreement" table from "user" table:

    Alter Table Agreement
    ADD CONSTRAINT fk_agreement1
    Foreign Key (Id_Two)
    REFERENCES user(id)

2. Foreign key for "email" table from "Agreement" table:


    Alter Table Email
    ADD CONSTRAINT fk_email1
    Foreign Key (Agreement_Id)
    REFERENCES Agreement(Agreement_Id)

3. Foreign key for "email" table from "user" table:

    Alter Table Email
    ADD CONSTRAINT fk_email2
    Foreign Key (id)
    REFERENCES user(id)

因此,您可以添加所有约束。

【讨论】:

    【解决方案3】:

    你必须给你的外键一个不同的名字(这个名字似乎已经被占用了)。 更改名称,它应该可以工作。

    CONSTRAINT fk_email_user FOREIGN KEY (id) REFERENCES user(id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2018-03-25
      相关资源
      最近更新 更多