use*_*139 4 database-design sql-server constraint cascade
正如你在这里看到的,在OrderInfo和 中OrderNumber,我有一个关系集。但我不确定是什么样的。我希望建立一个关系,所以如果我删除了OrderNumber,它会级联删除相应的记录中OrderInfo,但它不会让我。它给了我这个讨厌的'
不能在标识列上级联删除
错误,所以在删除级联删除后,它让我适当地保存它。我不确定关键的关键是什么,但我知道无限的关键是一对多?
看起来您的模型是OrderNumber和之间的一对一关系OrderInfo,OrderInfo.OrderID作为OrderInfo主键和作为外键引用OrderNumber.OrderID。
错误消息表明您已定义OrderInfo.OrderID为一IDENTITY列。它不应该IDENTITY-在插入OrderID相关OrderNumber行时应该使用来自三个相关行的分配值OrderInfo来维护外键关系。那应该允许您指定DELETE CASCADE.
如果你想OrderInfo.OrderID成为一个引用的外键OrderNumber.OrderID,那么你必须将它声明为INTEGER不像INTEGER IDENTITY. 如果它是一个身份,则无法为其分配OrderID插入 to 后将检索到的对应的实际值OrderNumber。
也就是说,你应该像这样声明你的表:
CREATE TABLE Customer
(
CustomerID integer IDENTITY(1,1) PRIMARY KEY,
FirstName varchar(100),
LastName varchar(100)
) ;
CREATE TABLE Consultants
(
ConsultantID integer IDENTITY(1,1) PRIMARY KEY,
EmployeeID integer /* REFERENCES Employees(EmployeeID) */
) ;
CREATE TABLE OrderNumber
(
OrderID integer IDENTITY(1,1) PRIMARY KEY,
CustomerID integer REFERENCES Customer(CustomerID) ON DELETE NO ACTION, /* Referenced CustomerID cannot be deleted */
ConsultantID integer REFERENCES Consultants(ConsultantID) ON DELETE NO ACTION /* Referenced ConsultantID cannot be deleted */
) ;
CREATE TABLE OrderInfo
(
OrderID integer NOT NULL REFERENCES OrderNumber(OrderID) ON DELETE CASCADE,
/* My assumption: one order can have several items
If that were not the case, the following column could be ommitted.
Otherwise, just put all the [OrderInfo] columns in [OrderNumber] table,
and just call it [Order].
*/
SomeOtherColumnSuchAsLineNumber integer NOT NULL,
/* The actual PK should be a composite */
PRIMARY KEY (OrderID, SomeOtherColumnSuchAsLineNumber),
/* Rest of columns */
Cost decimal(12,2),
Description varchar(max)
) ;
-- etc.
Run Code Online (Sandbox Code Playgroud)
我们插入客户、顾问和两个订单,每个订单有两个 OrderInfo(我假设一个订单可以有多个项目,并添加了一个额外的列来对它们进行排序)。
INSERT INTO Customer(FirstName, LastName)
OUTPUT inserted.CustomerID
VALUES('John', 'Doe') ;
GO
Run Code Online (Sandbox Code Playgroud)
| 客户 ID | | ---------: | | 1 |
INSERT INTO Consultants(EmployeeID)
OUTPUT inserted.ConsultantID
VALUES (1), (2);
GO
Run Code Online (Sandbox Code Playgroud)
| 顾问编号 | | -----------: | | 1 | | 2 |
INSERT INTO OrderNumber(CustomerID, ConsultantID)
OUTPUT inserted.OrderID
VALUES (1,1), (1,2) ;
GO
Run Code Online (Sandbox Code Playgroud)
| 订单号 | | ------: | | 1 | | 2 |
INSERT INTO OrderInfo
(OrderID, SomeOtherColumnSuchAsLineNumber, Cost, Description)
VALUES
(1, 1, 100.00, 'Item costing 100.00'),
(1, 2, 99.99, 'Item costing 99.99'),
(2, 1, 200.00, 'Item costing 200.00'),
(2, 2, 199.99, 'Item costing 199.99') ;
GO
Run Code Online (Sandbox Code Playgroud)
4 行受影响
此时,如果您确实有 for 行OrderInfo:
SELECT
* -- Don't do this in production, just in demo
FROM
OrderInfo
ORDER BY
OrderInfo.OrderID, OrderInfo.SomeOtherColumnSuchAsLineNumber ;
GO
Run Code Online (Sandbox Code Playgroud)
订单号 | SomeOtherColumnSuchAsLineNumber | 成本 | 描述
------: | ------------------------------: | :----- | :------------------
1 | 1 | 100.00 | 项目成本 100.00
1 | 2 | 99.99 | 物品售价 99.99
2 | 1 | 200.00 | 物品花费 200.00
2 | 2 | 199.99 | 物品售价 199.99
如果您现在从OrderNumber一行中删除,更改将传播到OrderInfo
DELETE FROM
OrderNumber
WHERE
OrderID = 2;
GO
Run Code Online (Sandbox Code Playgroud)
1 行受影响
-- We deleted from OrderNumber OrderID = 2, it won't appear here
SELECT
* -- Don't do this in production, just in demo
FROM
OrderInfo
ORDER BY
OrderInfo.OrderID, OrderInfo.SomeOtherColumnSuchAsLineNumber ;
GO
Run Code Online (Sandbox Code Playgroud)
订单号 | SomeOtherColumnSuchAsLineNumber | 成本 | 描述
------: | ------------------------------: | :----- | :------------------
1 | 1 | 100.00 | 项目成本 100.00
1 | 2 | 99.99 | 物品售价 99.99
您可以在dbfiddle此处检查所有内容