0

我想创建两个表。practice有一个AUTO_INCREMENT附件并且是一个PRIMARY KEY. 具有作为引用continued的 id 实体continued_id存在的 id 实体。Mysql 可以正常执行下面的代码,直到第 19 行,我收到 1364 错误,说明没有默认值。FOREIGN KEYpractice(user_id)continued_id

我很困惑。我认为user_id,哪个 auto_increments,它是 PK,将具有定义值 1、2、3...我认为这continued_id相当于user_id,因此它的默认值为 1?也许我误解了PK和FK在sql中的实际工作方式?

错误:

20:03:02    INSERT INTO continued(hobby) VALUES("Tennis")   Error Code: 1364. Field 'continued_id' doesn't have a default value 0.000 sec

CREATE TABLE practice(
    user_id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
    user_name VARCHAR(60) NOT NULL,
    user_real_name VARCHAR(60) NOT NULL
);
CREATE TABLE continued(
    continued_id INT NOT NULL,
    FOREIGN KEY(continued_id)REFERENCES practice(user_id),
    hobby VARCHAR(25) NOT NULL
);
INSERT INTO practice(user_name,user_real_name)
VALUES("KittenKing","Henry");
INSERT INTO practice(user_name,user_real_name)
VALUES("DogDictator","Mary");
INSERT INTO practice(user_name,user_real_name)
VALUES("HamsterHam","Denver");

INSERT INTO continued(hobby)
VALUES("Tennis");
INSERT INTO continued(hobby)
VALUES("Hockey");
INSERT INTO continued(hobby)
VALUES("Spear Hunting");

SELECT * FROM practice,continued;
4

3 回答 3

1

你的表在表中continued有外键,所以这个字段是强制性的。continued_idpractice

INSERT INTO continued(continued_id, hobby)
VALUES(1, "Tennis");
INSERT INTO continued(continued_id, hobby)
VALUES(2, "Hockey");
INSERT INTO continued(continued_id, hobby)
VALUES(3, "Spear Hunting");
于 2019-10-15T01:22:36.337 回答
1

您的插入continued需要链接到practice. 您可以通过在 insert into 之后立即practice使用continuedfor 来LAST_INSERT_ID()执行此操作continued_id

INSERT INTO practice (user_name,user_real_name)
VALUES("KittenKing","Henry");
INSERT INTO continued (continued_id, hobby)
VALUES(LAST_INSERT_ID(), 'Tennis')

practice或通过在使用INSERT ... SELECT查询时引用适当的条目:

INSERT INTO continued (continued_id, hobby)
SELECT user_id, 'Hockey'
FROM practice 
WHERE user_real_name = 'Mary'

或者

INSERT INTO continued (continued_id, hobby)
SELECT user_id, 'Spear Hunting'
FROM practice 
WHERE user_name = 'HamsterHam'

dbfiddle 上的演示

请注意,您不需要声明continued_idAUTO_INCREMENT.

于 2019-10-15T02:03:16.103 回答
0

idforcontinued需要是最后插入的 id 用于练习。假设您每次练习都有一个爱好,我建议:

INSERT INTO practice (user_name, user_real_name)
    VALUES('KittenKing', 'Henry');

INSERT INTO continued (continued_id, hobby)
    VALUES(LAST_INSERT_ID(), 'Tennis');

INSERT INTO practice(user_name, user_real_name)
    VALUES('DogDictator', 'Mary');

INSERT INTO continued (hobby)
    VALUES (LAST_INSERT_ID(), 'Hockey');

INSERT INTO practice(user_name ,user_real_name)
    VALUES('HamsterHam', 'Denver');

INSERT INTO continued (continued_id, hobby)
    VALUES (LAST_INSERT_ID(), 'Spear Hunting');
于 2019-10-15T02:57:31.653 回答