#sql #sql-server #syntax #foreign-keys #key
Вопрос:
CREATE TABLE STUDENT
(
stu_id CHAR(5) PRIMARY KEY,
stu_lname VARCHAR(15) NOT NULL,
stu_minit CHAR,
stu_fname VARCHAR(15) NOT NULL,
department VARCHAR(15)
);
CREATE TABLE FGKMKJWEKJH
(
stu_id CHAR(5),
crs_id CHAR(8),
sem_id CHAR(5),
Grade CHAR(2),
Mark DECIMAL(4, 2) CHECK (Mark BETWEEN 0.00 AND 100.00),
CONSTRAINT fk_inv_product_id
FOREIGN KEY (stu_id) REFERENCES STUDENT(stu_id)
ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT pkVW
PRIMARY KEY (stu_id, crs_id, sem_id)
);
Комментарии:
1. Не могли бы вы, пожалуйста, опубликовать полное и точное сообщение(сообщения) об ошибке, которое вы получаете?? Также: для какой версии SQL Server это предназначено??
2.
stu_id
вFGKMKJWEKJH
таблице есть частьprimary key
, а также у вас есть поведение FK, установленноеSET NULL
на удаление. Значение null нарушитprimary key
ограничение, так что это недопустимо. Вам нужно будет удалитьSET NULL
поведение или удалить этот столбец изprimary key
ограничения…PRIMARY KEY (stu_id, crs_id, sem_id)
.CASCADE
было бы допустимым вариантом ограничения FK, но нетSET NULL
.3. Если вы действительно прочитали сообщение об ошибке, которое оно генерирует, оно точно укажет вам на проблему
because one or more referencing columns are not nullable.
Ответ №1:
Причина ошибки заключается stu_id
в том , что это часть primary key
ограничения FGKMKJWEKJH
, которое означает stu_id
, что должно быть NOT NULL
.
Вот один из допустимых вариантов. Вместо SET NULL
этого используйте ON DELETE CASCADE
:
CREATE TABLE FGKMKJWEKJH
(
stu_id CHAR(5),
crs_id CHAR(8),
sem_id CHAR(5),
Grade CHAR(2),
Mark DECIMAL(4, 2) CHECK (Mark BETWEEN 0.00 AND 100.00),
CONSTRAINT fk_inv_product_id
FOREIGN KEY (stu_id) REFERENCES STUDENT(stu_id)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT pkVW
PRIMARY KEY (stu_id, crs_id, sem_id)
);
и скрипка: