很抱歉,这个问题太标准了,但我想不出有效的方法
我有3个表Customer
,CustomerProject
和StandardProject
StandardProject
表包含Customer
表中每个客户必须拥有的所有项目的列表。 我的逻辑是,将新客户插入Customer
表中时,它将触发并将StandardProject
的所有项目插入CustomerProject
Create Table [Customer]
(
[CID] INTEGER PRIMARY KEY IDENTITY(1,1)
, Customer VARCHAR(50) NOT NULL UNIQUE
)
Create Table [CustomerProject]
(
ProjectID INTEGER PRIMARY KEY IDENTITY(1,1)
, [CID] INTEGER FOREIGN KEY REFERENCES [Customer](CID)
, Project VARCHAR(50) NOT NULL
, CONSTRAINT UN_Customer_Project UNIQUE([CID], Project)
)
Create Table [StandardProject]
(
ProjectID INTEGER PRIMARY KEY IDENTITY(1,1)
, Project VARCHAR(50) NOT NULL UNIQUE
)
INSERT INTO [StandardProject](Project) VALUES('PROJECT 1')
INSERT INTO [StandardProject](Project) VALUES('PROJECT 2')
INSERT INTO [StandardProject](Project) VALUES('PROJECT 3')
问题:当我插入Customer = 'My Customer'
时,是否有可能将'Project 1'
,'Project 2'
,'Project 3'
添加到CustomerProject
表中的触发器?>
实际上,StandardProject
可以有很多项目,而这些项目可以改变频率。
CREATE TRIGGER InsertStandardProjects ON [Customer]
FOR INSERT
AS
INSERT INTO [CustomerProject]([CID], [Project])...
答案 0 :(得分:0)
首先,我建议将CustomerProject
定义为:
CREATE TABLE [CustomerProject] (
ProjectID INTEGER FOREIGN KEY REFERENCES [StandardProject](ProjectID),
CID INTEGER FOREIGN KEY REFERENCES [Customer](CID),
CONSTRAINT UN_Customer_Project UNIQUE(CID, ProjectID)
)
此联结表仅用于存储客户及其项目之间的关系,不存储与客户或项目关联的元数据。因此,在此处存储Project
名称是不合适的,只是浪费空间。
话虽如此,您可以尝试使用以下触发器:
CREATE TRIGGER InsertStandardProjects ON [Customer]
FOR INSERT
AS
INSERT INTO [CustomerProject] (ProjectID, CID)
SELECT ProjectID, INSERTED.CID
FROM StandardProject
GO
上述触发器中的插入查询使用INSERTED
,它保存要插入的行中的值,其中包括客户的CID
。
答案 1 :(得分:0)
这样的事情。
CREATE TRIGGER InsertStandardProjects ON [Customer]
FOR INSERT
AS
INSERT INTO [CustomerProject]([CID], [Project])
SELECT i.CID, St.Project
FROM inserted i,StandardProject St
-检查
INSERT INTO Customer (Customer) VALUES ('MyNewCustomer')
SELECT * FROM [Customer]
SELECT * FROM [CustomerProject]
Output:
CID Customer
1 MyNewCustomer
ProjectID CID Project
1 1 PROJECT 1
2 1 PROJECT 2
3 1 PROJECT 3