Sql server T-SQL使用什么样的约束

Sql server T-SQL使用什么样的约束,sql-server,tsql,constraints,Sql Server,Tsql,Constraints,以下两个表仅显示了相关的键列 CREATE TABLE [dbo].[Jobs]( [ID] [int] IDENTITY(1,1) NOT NULL, [JobNo] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Jobs] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =

以下两个表仅显示了相关的键列

CREATE TABLE [dbo].[Jobs](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [JobNo] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Jobs] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


    CREATE TABLE [dbo].[Items](
    [JobID] [int] NOT NULL,
    [BarcodeNo] [nvarchar](50) NOT NULL,
    [SerialNo] [nvarchar](50) NOT NULL,

 CONSTRAINT [PK_Items_1] PRIMARY KEY CLUSTERED 
(
    [JobID] ASC,
    [BarcodeNo] ASC,
    [SerialNo] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
我需要确保在输入项目时,JobID与Jobs表中的ID匹配。看起来,我不能使用FK,因为items表中的PK是由3列组成的复合键

短暂性脑缺血发作

标记
我可以对此使用什么样的约束

外键可以正常工作

让单列[dbo].[Items].[JobID]引用作业的主键没有问题

CREATE TABLE [dbo].[Jobs]
  (
     [ID]    [INT] IDENTITY(1, 1) NOT NULL,
     [JobNo] [NVARCHAR](50) NOT NULL,
     CONSTRAINT [PK_Jobs] PRIMARY KEY CLUSTERED ( [ID] ASC )
     WITH (PAD_INDEX = OFF, 
           STATISTICS_NORECOMPUTE = OFF, 
           IGNORE_DUP_KEY = OFF, 
           ALLOW_ROW_LOCKS = ON, 
           ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  )
ON [PRIMARY]

CREATE TABLE [dbo].[Items]
  (
     [JobID]     [INT] NOT NULL REFERENCES [dbo].[Jobs]([ID]), /*<-- FK declaration*/
     [BarcodeNo] [NVARCHAR](50) NOT NULL,
     [SerialNo]  [NVARCHAR](50) NOT NULL,
     CONSTRAINT [PK_Items_1] PRIMARY KEY CLUSTERED ( [JobID] ASC, [BarcodeNo] ASC, [SerialNo] ASC )
    WITH (PAD_INDEX = OFF, 
          STATISTICS_NORECOMPUTE = OFF, 
          IGNORE_DUP_KEY = OFF, 
          ALLOW_ROW_LOCKS = ON, 
          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  )
ON [PRIMARY] 

外键工作正常

让单列[dbo].[Items].[JobID]引用作业的主键没有问题

CREATE TABLE [dbo].[Jobs]
  (
     [ID]    [INT] IDENTITY(1, 1) NOT NULL,
     [JobNo] [NVARCHAR](50) NOT NULL,
     CONSTRAINT [PK_Jobs] PRIMARY KEY CLUSTERED ( [ID] ASC )
     WITH (PAD_INDEX = OFF, 
           STATISTICS_NORECOMPUTE = OFF, 
           IGNORE_DUP_KEY = OFF, 
           ALLOW_ROW_LOCKS = ON, 
           ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  )
ON [PRIMARY]

CREATE TABLE [dbo].[Items]
  (
     [JobID]     [INT] NOT NULL REFERENCES [dbo].[Jobs]([ID]), /*<-- FK declaration*/
     [BarcodeNo] [NVARCHAR](50) NOT NULL,
     [SerialNo]  [NVARCHAR](50) NOT NULL,
     CONSTRAINT [PK_Items_1] PRIMARY KEY CLUSTERED ( [JobID] ASC, [BarcodeNo] ASC, [SerialNo] ASC )
    WITH (PAD_INDEX = OFF, 
          STATISTICS_NORECOMPUTE = OFF, 
          IGNORE_DUP_KEY = OFF, 
          ALLOW_ROW_LOCKS = ON, 
          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  )
ON [PRIMARY] 

您可以使用外键引用多个列;如果子表中没有全部3列,则可以使用外键引用多个列;I don’我没有孩子表中的所有3列,我一定是遗漏了什么。我得到一个错误,说在JobID、BarcodeNo和SerialNo的作业中没有主键。从我所做的搜索来看,大多数人都同意这是不可能的。我唯一能做的就是在Items上创建一个代理PK,将JobID、BarcodeNo和SerialNo作为唯一索引,然后在Items.JobID和Jobs.ID之间创建Fk。我错过什么了吗?@mark1234是的,你一定错过了。我回答中的代码表明它工作正常。如果试图在创建表后添加FK,请使用ALTER table dbo.Items,并选中add FOREIGN KEYJobID REFERENCES dbo.Jobs IDDon;我不知道我做错了什么。工作完美。谢谢bunch@mark1234-从错误消息中,您得到的信息听起来像您或可能是视觉工具?正在执行ALTER TABLE dbo。带有检查ADD FOREIGN KEYJobID、BarcodeNo、SerialNo的项引用dbo。Jobs@Martin史密斯-是的,就是这样。正在使用SSMS的可视化工具。我一定错过了什么。我得到一个错误,说在JobID、BarcodeNo和SerialNo的作业中没有主键。从我所做的搜索来看,大多数人都同意这是不可能的。我唯一能做的就是在Items上创建一个代理PK,将JobID、BarcodeNo和SerialNo作为唯一索引,然后在Items.JobID和Jobs.ID之间创建Fk。我错过什么了吗?@mark1234是的,你一定错过了。我回答中的代码表明它工作正常。如果试图在创建表后添加FK,请使用ALTER table dbo.Items,并选中add FOREIGN KEYJobID REFERENCES dbo.Jobs IDDon;我不知道我做错了什么。工作完美。谢谢bunch@mark1234-从错误消息中,您得到的信息听起来像您或可能是视觉工具?正在执行ALTER TABLE dbo。带有检查ADD FOREIGN KEYJobID、BarcodeNo、SerialNo的项引用dbo。Jobs@Martin史密斯-是的,就是这样。正在使用SSMS的可视化工具。