Как удалить строки из таблиц с внешними ключами в SAP ASE Sybase 16 - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь выполнить удаление строки из сотрудника таблицы, у которого первичный ключ установлен в столбце «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, поскольку это не ПК для таблицы, но, очевидно, это не помогло.

1 Ответ

0 голосов
/ 19 июня 2019

Быстрый ответ состоит в том, что вы должны обновить зависимые таблицы ниже, прежде чем удалять основную строку, чтобы удалить зависимости - оставив столбец внешнего ключа, который ранее требовался для вашей модели данных, как ноль в целевой таблице (в любом случае IMO)плохая практика.В вашем примере этот сотрудник создал такие данные, как данные филиала, которые связаны с этим сотрудником - наверняка вы не захотите просто вернуться к нулю, поскольку это может серьезно повлиять на такие вещи, как отчетность по филиалам, использующим внутренние объединения или группирование на основе этих идентификаторов.и не учитывает, что идентификатор сотрудника является нулевым.

Вы можете добавить триггер удаления, который будет выполнять обновление зависимых данных, если вместо этого это будет бизнес-требование, аналогичное приведенному в этом примере: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1550/html/sqlug/X15877.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...