根据错误 1364,id 值需要一个默认值?

id value needs a default value according to error 1364?

我想创建两个表。 practice 有一个 AUTO_INCREMENT 附件并且是 PRIMARY KEYcontinued 具有 ID 实体 continued_id,它作为引用 practice(user_id)FOREIGN KEY 存在。 Mysql 执行下面的代码直到第 19 行,我收到 1364 错误,指出 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;

你的 table continued 在 table practice 中有外键 continued_id,所以这个字段是必填的。

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

您在 continued 中的插入需要链接到 practice 中的条目。您可以通过使用 LAST_INSERT_ID() for continued_id:

插入 continued 后立即插入 practice 来实现
INSERT INTO practice (user_name,user_real_name)
VALUES("KittenKing","Henry");
INSERT INTO continued (continued_id, hobby)
VALUES(LAST_INSERT_ID(), 'Tennis')

或使用 INSERT ... SELECT 查询引用 practice 中的相应条目:

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'

Demo on dbfiddle

请注意,您 不需要continued_id 声明为 AUTO_INCREMENT

continuedid 需要是最后插入的 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');