单个主键的2个外键引用

时间:2015-08-11 12:55:05

标签: php mysql database codeigniter

我有3个表:协议,用户,电子邮件如下,用户表中的id充当电子邮件表(id(FK))中的外键以及协议表id_two(FK)。

enter image description here

我已成功使用以下代码将电子邮件表中的id(Foriegn Key)引用到用户表中的id(主键):



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);




3 个答案:

答案 0 :(得分:2)

这很可能是因为您已经在名为agreement的{​​{1}}表中定义了约束。更改约束的名称,并参阅

id_two

答案 1 :(得分:1)

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

外键是一个表中的一列或一组列,其值必须在另一个(或相同)表的主键中具有匹配值。据说外键引用其主键。外键是用于维护数据完整性的机制。

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

--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)

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

答案 2 :(得分:0)

您必须为您的外键指定一个不同的名称(似乎已经采用了该名称)。 更改名称,它应该工作。

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