在MYSQL数据库中使用外键有问题

时间:2014-03-17 12:24:08

标签: mysql sql foreign-keys

我在mySQL中使用外键时遇到问题。我看不出我所做的代码有什么问题,但是当我用外键(公司表(userid)将数据插入到表中时,它不起作用。抱歉是模糊的......第一次问这里。

CREATE TABLE users 
(
userid INT(4) NOT NULL auto_increment,
username VARCHAR(30) NOT NULL,
email VARCHAR(32) NOT NULL,
password VARCHAR(32) NOT NULL,
companyName VARCHAR(32) NOT NULL,
address VARCHAR(30) NOT NULL,
PRIMARY KEY (userid)
) ENGINE=INNODB;





DROP TABLE IF EXISTS company;

CREATE TABLE company 
(
userid int(4) NOT NULL,
companyid INT(4) NOT NULL auto_increment,
companyName VARCHAR(32) NOT NULL,
address VARCHAR(30) NOT NULL,
telephone INT(20) NOT NULL,
email VARCHAR(30) NOT NULL,
textbody VARCHAR(1800) NOT NULL,
textbody2 VARCHAR(1500) NOT NULL,
PRIMARY KEY (companyid),
FOREIGN KEY (userid) REFERENCES users(userid)
) ENGINE=INNODB;

这是INSERT STATEMENT

INSERT INTO company (companyName, address, telephone, email, textbody, textbody2)VALUES 
('blaaah', 'Ireland', '12345', 'emailAddress', 'randomtext', 'morerandomtext');

这是错误

#1452 - Cannot add or update a child row: a foreign key constraint     fails(`users`.`company`, CONSTRAINT `company_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `    users` (`userid`))

2 个答案:

答案 0 :(得分:2)

您无法在userid表中插入具有特定company值的行,直到您将具有相同值的行插入users表中。这就是FK约束强制执行的内容。

您在问题中显示的INSERT INTO company语句未指定userid的值。如果您正在使用外键约束,则必须指定该值,并且该值必须是users表中存在的值之一。

您如何提出有效的userid值?如果不了解您的业务逻辑,就很难准确回答:为什么每个company行必须只引用一行users行?

解决问题的一种方法是在INSERT company之后立即INSERT INSERT行(立即!没有介入users语句!)行。在这种情况下,MySQL函数LAST_INSERT_ID()将包含适当的自动增量值。

INSERT INTO users
       (username, email, password, company, address)
VALUES ('mickey', 'mickey@disney.com', 'ILuvMinnie', 'Walt Disney', 'Burbank');

INSERT INTO company 
       (userid, 
        companyName, address, telephone, 
        email, textbody, textbody2)
VALUES (LAST_INSERT_ID(),   /* from the previous insert */
       'Walt Disney', 'Burbank, CA', '203 555 1212',
       'info@disney.com', 'The Happiest Place on Earth.', 'morerandomtext');

答案 1 :(得分:0)

请尝试以下代码:SQLFiddle

我在电话中使用数字格式,在插入语句中使用last_insert_id()。

insert into users (username, email, password, companyName, address) 
values ('test', 'test@test.com', 'ghghb', 'test corp', 'test');

insert into company (userid, companyName, address, telephone, email, textbody, textbody2) 
values (last_insert_id(), 'test','test', 123456, 'test@test.com', 'test', 'test');

请检查公司表和check this link的constrait语句。

我认为在向公司插入新行时,不要将userId添加到INSERT语句中。但是你应该添加一个现有的userId。

根据评论:

如果您想在没有userId的情况下插入新的公司行,请将表格结构定义为:

CREATE TABLE company 
(
userid int(4),
companyid INT(4) NOT NULL auto_increment,
companyName VARCHAR(32) NOT NULL,
address VARCHAR(30) NOT NULL,
telephone INT(20) NOT NULL,
email VARCHAR(30) NOT NULL,
textbody VARCHAR(1800) NOT NULL,
textbody2 VARCHAR(1500) NOT NULL,
PRIMARY KEY (companyid),

) ENGINE=INNODB; 

在这种情况下,我不定义foreign key。您可以使用或不使用userId新公司行进行插入。