sap - 如何在 SAP ASE Sybase 16 中从具有外键的表中删除行
问题描述
我正在尝试从表employee 中执行行删除,该表employee 在“emp_id”列上设置了主键,并被其他表及其外键引用。Sybase 不允许我执行删除。返回的示例味精是:
引用完整性约束中的从属外键约束违反。dbname = 'giraffe',表名 = 'branch',约束名 = 'client_800002850'。命令已中止。
使用 MySQL,如果您使用 ON DELETE 子句指定外键,则可以轻松进行这种删除,但 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 员工外键(branch_id)参考分支(branch_id)2019 年 6 月 18 日上午 10:44
- works_with_848003021works_with 外键(emp_id)参考员工(emp_id)2019 年 6 月 17 日晚上 7:26
- employee_752002679 员工外键(super_id)自引用员工(emp_id)2019 年 6 月 17 日晚上 7:24
- employee_960003420 员工外键(super_id)自引用员工(emp_id)匹配已满 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,但显然它没有帮助。
解决方案
快速的回答是,您将在删除主行以删除依赖项之前更新下面的依赖表 - 将以前数据模型所需的外键列在目标表中保留为空(无论如何,IMO)是不好的做法。在您的示例中,员工创建了数据,例如与该员工相关联的分支数据 - 当然,您不会只是返回 null,因为这可能会严重影响诸如使用内部连接或基于这些 ID 分组的每个分支的报告并且不考虑员工 ID 为空。
如果这是类似于此示例的业务需求,您可以添加一个删除触发器,该触发器将对相关数据进行更新:http: //infocenter.sybase.com/help/index.jsp ?topic=/com.sybase .infocenter.dc32300.1550/html/sqlug/X15877.htm
推荐阅读
- javascript - AngularJS 简单应用程序网页停止渲染代码
- encryption - 骆驼 2.21.0 - pgp 加密不起作用
- angular - 如何删除 HTTP 拦截器中设置的内容类型以在 angular4 中上传文件
- python - 如何在 Python 中读取包含多个元素的列的 CSV
- android - Android Studio 格式化问题中的 CIFS/SMB 网络协议
- java - Spring项目中的ManyToMany关系出错
- polygon - 如何最好地对 5 点星形多边形进行三角测量?
- asp.net-mvc - 打开模态时,我的主视图变成黑色 MVC
- bash - 从具有二进制模式字符串的文件中删除行
- gcc - GNU LD 链接描述文件 - 堆栈放置