我读了很多关于这个问题的主题。但我没有解决我的问题。
我创建了两个表:污染物和警报。在 Alerte 中,我定义了污染物的 id 外键。这是表的创建代码:
CREATE TABLE IF NOT EXISTS Polluant (
idPol int(3) PRIMARY KEY AUTOINCREMENT,
nom varchar(10) UNIQUE NOT NULL,
unite varchar(10) NOT NULL
);
CREATE TABLE IF NOT EXISTS Alerte(
idAlerte int(3) PRIMARY KEY AUTO_INCREMENT,
unite varchar(10) NOT NULL,
Max1 int(10) NOT NULL,
Max2 int(10) NOT NULL,
Max3 int(10) NOT NULL,
type boolean NOT NULL,
idPol int(3),
FOREIGN KEY (idPol) REFERENCES Polluant(idPol)
);
以下是条目:
insert into polluant(nom,unite) values ("testPol","g/m3");
insert into alerte values (1,"test",1,2,3,true,1);
insert into alerte values (2,"autretest",2,4,40,false,1); !! this one isn't OK
目前正在尝试 mysql,但它将尽快在 sqllite 上运行。
我在污染物表中添加了一个条目,id=1。 我在 Alerte 表中添加了一个条目,idPol = 1。没问题。
我在 Alerte 表中添加了第二个条目,其中 idPol = 1。 MySQL 高兴地告诉我:
1062 - key “idPol”的条目“1”重复
嗯嗯。为什么 ?它在表 pollunant ofc 中必须是唯一的,确实如此,但它不必在 Alerte 中,不是吗?好吧,我不明白这个问题,它对我来说看起来很好。有人有主意吗? 想法
最佳答案
您引用了Polluant
表,因此您的插入值必须是不重复的值
外键 (idPol) 引用污染物 (idPol)
很可能您的列设置为“唯一”,并且您尝试输入的行的 ID
已存在于表中。
您可能正在尝试插入 ID(或其他字段)1 集的记录,而表中已存在这样的记录。作为主键的字段对于每条记录都必须具有唯一的值。
将列设置为 auto_increment 并且在插入行时不插入值(让它自动填充)将是最好的解决方法。或者您可以看到表中的最后一个 ID,并将其加一作为您的值
关于mysql - 外键力独特,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22711516/