Я пытаюсь выполнить удаление строки из сотрудника таблицы, у которого первичный ключ установлен в столбце «emp_id» и на который ссылаются другие таблицы с их внешними ключами. Sybase не позволяет мне выполнять удаление. Пример сообщения назад:
Зависимое ограничение внешнего ключа в ограничении ссылочной целостности. dbname = 'giraffe', имя таблицы = 'branch', имя ограничения = 'client_800002850'.
Команда была прервана.
С MySQL можно легко сделать этот тип удаления, если вы указали внешние ключи с помощью предложения ON DELETE, но Sybase не поддерживает это. Единственное необязательное условие для внешних ключей в этой СУБД - «MATCH FULL»
Как можно удалить строки или установить значения NULL в Sybase, если установлены внешние ключи? Я абсолютный новичок в T-SQL и DBA. Насколько я понимаю, имея такую схему БД, это потребовало бы отсутствия внешних ключей вообще, или я что-то упустил? Может быть, эта схема специфична для MySQL, и ее следует кодировать по-разному, чтобы соответствовать стандартам Sybase t-sql?
вот DDL. ссылка на курс - https://www.youtube.com/watch?v=HXV3zeQKqGY
===========================
CREATE TABLE employee (
emp_id INT PRIMARY KEY,
first_name VARCHAR(40),
last_name VARCHAR(40),
birth_day DATE,
sex VARCHAR(1),
salary INT,
super_id INT,
branch_id INT
);
CREATE TABLE branch (
branch_id INT PRIMARY KEY,
branch_name VARCHAR(40),
mgr_id INT,
mgr_start_date DATE,
FOREIGN KEY(mgr_id) REFERENCES employee(emp_id) ON DELETE SET NULL
);
ALTER TABLE employee
ADD FOREIGN KEY(branch_id)
REFERENCES branch(branch_id)
ON DELETE SET NULL;
ALTER TABLE employee
ADD FOREIGN KEY(super_id)
REFERENCES employee(emp_id)
ON DELETE SET NULL;
CREATE TABLE client (
client_id INT PRIMARY KEY,
client_name VARCHAR(40),
branch_id INT,
FOREIGN KEY(branch_id) REFERENCES branch(branch_id) ON DELETE SET NULL
);
CREATE TABLE works_with (
emp_id INT,
client_id INT,
total_sales INT,
PRIMARY KEY(emp_id, client_id),
FOREIGN KEY(emp_id) REFERENCES employee(emp_id) ON DELETE CASCADE,
FOREIGN KEY(client_id) REFERENCES client(client_id) ON DELETE CASCADE
);
CREATE TABLE branch_supplier (
branch_id INT,
supplier_name VARCHAR(40),
supply_type VARCHAR(40),
PRIMARY KEY(branch_id, supplier_name),
FOREIGN KEY(branch_id) REFERENCES branch(branch_id)
Вот список ограничений для этой таблицы «работника»
- branch_1008003591 филиал FOREIGN KEY (mgr_id) ССЫЛКИ сотрудник (emp_id) 18 июня 2019 11:58 AM
- employee_880003135 сотрудника FOREIGN KEY (branch_id) ССЫЛКИ филиал (branch_id) 18 июня 2019 10:44 AM
- works_with_848003021 works_with FOREIGN KEY (emp_id) ССЫЛКИ сотрудник (emp_id) 17 июня 2019 г. 19:26 PM
- employee_752002679 сотрудника FOREIGN KEY (super_id) САМОСТОЯТЕЛЬНАЯ ССЫЛКА сотрудника (emp_id) 17 июня 2019 г. 19:24
- employee_960003420 сотрудника FOREIGN KEY (super_id) САМОСТОЯТЕЛЬНЫЕ ССЫЛКИ сотрудник (emp_id) МАТЧ ПОЛНЫЙ 18 июня 2019 г. 11:17 AM
- employee_6720023941 ИНДЕКС ПЕРВИЧНОГО КЛЮЧА (emp_id): КЛАСТЕР, ИНОСТРАННАЯ ССЫЛКА
Я хочу выполнить следующий DML:
DELETE from dbo.employee
WHERE employee.emp_id = 102
В этом курсе MySQL последующее автоматическое действие установило бы значение branch.mgr_id со 102 на NULL при условии, что внешний ключ для таблицы 'branch' был установлен с предложением ON DELETE SET NULL.
Я попытался настроить branch.mgr_id в NULL, поскольку это не ПК для таблицы, но, очевидно, это не помогло.