Я не знаю, что не так с этим кодом проблема в синтаксической ошибке внешнего ключа при удалении и обновлении

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

и скрипка:

Скрипка, показывающая старое и новое поведение