如何在SAP ASE Sybase 16中使用外键从表中删除行

时间:2019-06-18 11:04:10

标签: sap sybase sybase-ase ase

我正在尝试从表employee中执行行删除,该雇员在'emp_id'列上设置了主键,并被其他表及其外键引用。 Sybase不允许我执行删除操作。后面的示例味精是:

参照完整性约束中的从属外键约束违反。 dbname ='giraffe',表名称='branch',约束名称='client_800002850'。 命令已中止。

如果使用ON DELETE子句指定外键,则使用MySQL可以轻松进行这种删除,但是Sybase不支持。此RDBMS中外键的唯一可选子句是'MATCH FULL'

如果设置了外键,如何在Sybase中删除行或将值设置为NULL?我是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分支外键(mgr_id)参考职员(emp_id)2019年6月18日上午11:58
  • employee_880003135员工FOREIGN KEY(branch_id)参考分支(branch_id)2019年6月18日上午10:44
  • works_with_848003021 works_with外键(emp_id)参考职员(emp_id)2019年6月17日下午7:26
  • employee_752002679员工外键(super_id)自荐雇员employee(emp_id)2019年6月17日下午7:24
  • employee_960003420员工外键(super_id)自荐雇员employee(emp_id)MATCH FULL 2019年6月18日上午11:17
  • employee_6720023941主键索引(emp_id):聚集,是外部引用

我要执行以下DML:

DELETE from dbo.employee
WHERE employee.emp_id = 102

在该MySQL课程中,如果已使用ON DELETE SET NULL子句设置了“分支”表的外键,则随后的自动操作将把branch.mgr_id值从102设置为NULL。

我尝试将branch.mgr_id设置为NULL,因为它不是表的PK,但显然没有帮助。

2 个答案:

答案 0 :(得分:0)

快速的答案是,在删除主行以删除依赖项之前,您将更新下面的依赖表-留下以前对于数据模型而言是必需的外键列,因为目标表中的空值(无论如何是IMO)是坏习惯。在您的示例中,员工创建了数据,例如链接到该员工的分支数据-当然,您不希望仅返回为null,因为这会严重影响诸如使用内部联接或基于这些ID进行分组的每个分支的报告之类的事情。并且不说明员工ID为空。

您可以添加一个删除触发器,如果​​这是一个与以下示例类似的业务需求,它将对相关数据进行更新: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1550/html/sqlug/X15877.htm

答案 1 :(得分:0)

删除主键行时,请删除从属表中的相应外键行。通过确保在删除明细行的主行时将其删除,从而保留了参照完整性。如果不删除从属表中的相应行,则可能会得到一个数据库,其中包含无法检索或标识的明细行。要正确删除相关的外键行,请使用执行级联删除的触发器。

在执行有关标题的delete语句时,将从标题表中删除一行或多行,并将其添加到已删除的行中。 触发器可以检查相关表(titleauthor,salesdetail和roysched),以查看它们是否有任何行的title_id与从标题中删除的title_id相匹配,并且现在存储在已删除的表中。如果触发器找到任何此类行,则会将其删除。

create trigger delcascadetrig 
on titles 
for delete 
as 
delete titleauthor 
from titleauthor, deleted 
where titleauthor.title_id = deleted.title_id 
/* Remove titleauthor rows that match deleted
** (titles) rows.*/
delete salesdetail 
from salesdetail, deleted 
where salesdetail.title_id = deleted.title_id 
/* Remove salesdetail rows that match deleted
** (titles) rows.*/ 
delete roysched 
from roysched, deleted 
where roysched.title_id = deleted.title_id 
/* Remove roysched rows that match deleted
** (titles) rows.*/

源:-

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1600/doc/html/san1390612501571.html