如何从 SAP ASE Sybase 16 中具有外键的表中删除行
How to delete rows from tables with foreign keys in SAP ASE Sybase 16
我正在尝试从 table 员工执行行删除,该员工在 'emp_id' 列上设置了主键,并被其他 table 使用外键引用。 Sybase 不允许我执行删除。返回的示例消息是:
引用完整性约束中的依赖外键约束冲突。 dbname = 'giraffe', table name = 'branch', constraint name = 'client_800002850'.
命令已中止。
如果使用 ON DELETE 子句指定外键,则在 MySQL 中可以轻松进行此类删除,但 Sybase 不支持。此 RDBMS 中外键的唯一可选子句是 'MATCH FULL'
如果设置了外键,如何在 Sybase 中删除行或将值设置为 NULL?我是 t-sql 和 DBA 的新手。据我了解,拥有这样的数据库模式,它根本不需要外键,或者我错过了什么?也许这个模式是 MySQL 特定的,应该以不同的方式编码以满足 Sybase t-sql 标准?
这是 DDL。 link 到课程 - 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' table
- branch_1008003591 branch FOREIGN KEY (mgr_id) REFERENCES employee(emp_id) 2019 年 6 月 18 日 11:58AM
- employee_880003135 员工 FOREIGN KEY (branch_id) REFERENCES branch(branch_id) 2019 年 6 月 18 日 10:44AM
- works_with_848003021 works_with 外键 (emp_id) 参考员工 (emp_id) 2019 年 6 月 17 日 7:26PM
- employee_752002679 员工外键 (super_id) 自引用员工 (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 主键索引(emp_id):集群,外部引用
我想执行以下 DML:
DELETE from dbo.employee
WHERE employee.emp_id = 102
在 MySQL 课程中,如果 'branch' table 的外键已被设置,后续自动操作将设置 branch.mgr_id 值从 102 到 NULL使用 ON DELETE SET NULL 子句设置。
我尝试将 branch.mgr_id 设置为 NULL,因为它不是 table 的 PK,但显然它没有帮助。
快速回答是,在删除主行以删除依赖项之前,您将更新下面的依赖项 tables - 留下数据模型以前需要的外键列在target table (IMO无论如何)是不好的做法。在您的示例中,员工创建了数据,例如链接到该员工的分支数据 - 当然您不会只是返回 null,因为这可能会严重影响使用内部联接或基于这些 ID 分组的每个分支的报告并且不考虑员工 ID 为空的情况。
您可以添加一个删除触发器,如果这是类似于此示例的业务需求,它将对相关数据进行更新:
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1550/html/sqlug/X15877.htm
当您删除 primary-key 行时,删除相关 table 中相应的 foreign-key 行。这通过确保在删除主行时删除详细信息行来保留引用完整性。如果您不删除从属 table 中的相应行,您最终可能会得到一个包含无法检索或识别的详细信息行的数据库。要正确删除相关 foreign-key 行,请使用执行级联删除的触发器。
当对标题执行删除语句时,一行或多行会从标题中删除 table 并添加到 deleted 中。
触发器可以检查从属 tables——titleauthor、salesdetail 和 roysched——以查看它们是否有任何行的 title_id 与从标题中删除并现在存储的 title_ids 相匹配在已删除的 table 中。如果触发器找到任何此类行,它将删除它们。
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.*/
来源:-
我正在尝试从 table 员工执行行删除,该员工在 'emp_id' 列上设置了主键,并被其他 table 使用外键引用。 Sybase 不允许我执行删除。返回的示例消息是:
引用完整性约束中的依赖外键约束冲突。 dbname = 'giraffe', table name = 'branch', constraint name = 'client_800002850'. 命令已中止。
如果使用 ON DELETE 子句指定外键,则在 MySQL 中可以轻松进行此类删除,但 Sybase 不支持。此 RDBMS 中外键的唯一可选子句是 'MATCH FULL'
如果设置了外键,如何在 Sybase 中删除行或将值设置为 NULL?我是 t-sql 和 DBA 的新手。据我了解,拥有这样的数据库模式,它根本不需要外键,或者我错过了什么?也许这个模式是 MySQL 特定的,应该以不同的方式编码以满足 Sybase t-sql 标准?
这是 DDL。 link 到课程 - 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' table
- branch_1008003591 branch FOREIGN KEY (mgr_id) REFERENCES employee(emp_id) 2019 年 6 月 18 日 11:58AM
- employee_880003135 员工 FOREIGN KEY (branch_id) REFERENCES branch(branch_id) 2019 年 6 月 18 日 10:44AM
- works_with_848003021 works_with 外键 (emp_id) 参考员工 (emp_id) 2019 年 6 月 17 日 7:26PM
- employee_752002679 员工外键 (super_id) 自引用员工 (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 主键索引(emp_id):集群,外部引用
我想执行以下 DML:
DELETE from dbo.employee
WHERE employee.emp_id = 102
在 MySQL 课程中,如果 'branch' table 的外键已被设置,后续自动操作将设置 branch.mgr_id 值从 102 到 NULL使用 ON DELETE SET NULL 子句设置。
我尝试将 branch.mgr_id 设置为 NULL,因为它不是 table 的 PK,但显然它没有帮助。
快速回答是,在删除主行以删除依赖项之前,您将更新下面的依赖项 tables - 留下数据模型以前需要的外键列在target table (IMO无论如何)是不好的做法。在您的示例中,员工创建了数据,例如链接到该员工的分支数据 - 当然您不会只是返回 null,因为这可能会严重影响使用内部联接或基于这些 ID 分组的每个分支的报告并且不考虑员工 ID 为空的情况。
您可以添加一个删除触发器,如果这是类似于此示例的业务需求,它将对相关数据进行更新: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1550/html/sqlug/X15877.htm
当您删除 primary-key 行时,删除相关 table 中相应的 foreign-key 行。这通过确保在删除主行时删除详细信息行来保留引用完整性。如果您不删除从属 table 中的相应行,您最终可能会得到一个包含无法检索或识别的详细信息行的数据库。要正确删除相关 foreign-key 行,请使用执行级联删除的触发器。
当对标题执行删除语句时,一行或多行会从标题中删除 table 并添加到 deleted 中。 触发器可以检查从属 tables——titleauthor、salesdetail 和 roysched——以查看它们是否有任何行的 title_id 与从标题中删除并现在存储的 title_ids 相匹配在已删除的 table 中。如果触发器找到任何此类行,它将删除它们。
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.*/
来源:-