2

「emp_id」列に主キーが設定され、外部キーを持つ他のテーブルによって参照されているテーブル従業員から行の削除を実行しようとしています。Sybase では削除を実行できません。メッセージバックの例は次のとおりです。

参照整合性制約における依存外部キー制約違反。データベース名 = 'キリン'、テーブル名 = 'ブランチ'、制約名 = 'client_800002850'。コマンドは中止されました。

MySQL では、ON DELETE 句で外部キーを指定すると、この種の削除を簡単に行うことができますが、これは Sybase ではサポートされていません。この RDBMS の外部キーの唯一のオプション句は「MATCH FULL」です

外部キーが設定されている場合、Sybaseで行を削除したり、値をNULLに設定したりするにはどうすればよいですか? 私は t-sql と DBA のまったくの初心者です。私の理解では、このような db スキーマを使用すると、外部キーをまったく持たない必要がありますか、それとも何か不足していますか? おそらく、このスキーマは 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) 

この「employee」テーブルの制約のリストは次のとおりです。

  • branch_1008003591 ブランチ FOREIGN KEY (mgr_id) REFERENCES employee(emp_id) 2019 年 6 月 18 日 11:58AM
  • employee_880003135 employee FOREIGN KEY (branch_id) REFERENCES branch(branch_id) 2019 年 6 月 18 日 10:44AM
  • works_with_848003021 works_with FOREIGN KEY (emp_id) REFERENCES 従業員 (emp_id) 2019 年 6 月 17 日 19:26
  • employee_752002679 employee FOREIGN KEY (super_id) SELF REFERENCES employee(emp_id) 2019 年 6 月 17 日 7:24PM
  • employee_960003420 employee FOREIGN KEY (super_id) SELF REFERENCES employee(emp_id) MATCH FULL Jun 18 2019 11:17AM
  • employee_6720023941 PRIMARY KEY INDEX ( emp_id) : クラスター化、外部参照

次の DML を実行したい:

DELETE from dbo.employee
WHERE employee.emp_id = 102

その MySQL コースでは、'branch' テーブルの外部キーが ON DELETE SET NULL 句で設定されていた場合、後続の自動アクションは branch.mgr_id 値を 102 から NULL に設定していたでしょう。

テーブルのPKではないため、branch.mgr_idをNULLに設定しようとしましたが、明らかに役に立ちませんでした。

4

2 に答える 2