Значение id требует значения по умолчанию в соответствии с ошибкой 1364? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу создать две таблицы. practice имеет вложение AUTO_INCREMENT и является PRIMARY KEY. continued имеет идентификатор continued_id, который существует как FOREIGN KEY, который ссылается на practice(user_id). 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;

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Ваши вставки в continued должны быть связаны с записью в practice. Вы можете сделать это либо сразу после вставки в practice со вставкой в ​​continued, используя 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_id как AUTO_INCREMENT.

1 голос
/ 15 октября 2019

ваша таблица continued имеет внешний ключ continued_id в таблице practice, поэтому это поле является обязательным.

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");
0 голосов
/ 15 октября 2019

id для continued должен быть последним вставленным идентификатором для практики. Предполагая, что вы хотите одно хобби на тренировку, я бы порекомендовал:

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...