我有3个表:协议,用户,电子邮件如下,用户表中的id充当电子邮件表(id(FK))中的外键以及协议表id_two(FK)。
我已成功使用以下代码将电子邮件表中的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);

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