添加具有常量值的引用约束

时间:2017-03-13 13:22:50

标签: sql sql-server

我有一张地点表:

CREATE TABLE [dbo].[loca_location] (
    [loca_id] [int] NOT NULL IDENTITY,
    [loca_name] [nvarchar](100) NOT NULL,
    [loca_address_line_1] [nvarchar](100),
    [loca_address_line_2] [nvarchar](100),
    [loca_address_line_3] [nvarchar](100),
    [loca_address_town] [nvarchar](100),
    [loca_address_county] [nvarchar](100),
    [loca_post_code] [nvarchar](12),
    [loca_active] [bit] NOT NULL,
    [loca_created] [datetimeoffset](0) NOT NULL,
    [loca_created_by] [nvarchar](50) NOT NULL,
    [loca_modified] [datetimeoffset](0) NOT NULL,
    [loca_modified_by] [nvarchar](50) NOT NULL,
    [loca_deleted] [datetimeoffset](0),
    [loca_deleted_by] [nvarchar](50),
    [loca_type] [char](1),
    CONSTRAINT [PK_dbo.loca_store] PRIMARY KEY ([loca_id])
)

现在一些地方可能是我自己的,其他地方可能是客户。如果是客户,则loca_type将为C。如果我拥有它,它将是L。如果是供应商,那么它将是S

现在合同应该始终属于客户,所以我想这样做loca_type = C是一个约束以及loca_id

ALTER TABLE [dbo].[cont_contract] ADD CONSTRAINT [FK_dbo.cont_contract_dbo.loca_location_cust_id] FOREIGN KEY ([loca_id_customer]) REFERENCES [dbo].[loca_location] ([loca_id], `C`)

这不起作用。可以做我想做的事吗?

1 个答案:

答案 0 :(得分:1)

这可能有用

1. [loca_location]表上的解除UNIQUE([loca_id],[loca_type])。这是正确的,因为PK的任何超集都是独一无二的。

2.将常量列添加到[cont_contract]表。

3.创建FK。

CREATE TABLE [dbo].[loca_location] (
    [loca_id] [int] NOT NULL IDENTITY,
    --..
    [loca_type] [char](1) CHECK ([loca_type] IN ('A','B','C')),  -- change as needed
    CONSTRAINT [PK_dbo.loca_store] PRIMARY KEY ([loca_id])
)
ALTER TABLE [dbo].[loca_location] ADD CONSTRAINT [u1] UNIQUE ([loca_id],[loca_type]);


CREATE TABLE [dbo].[cont_contract] (
    [id] [int] NOT NULL IDENTITY,
    --..
    [loca_id_customer] Int,
    -- Constant column
    [loca_type] [char](1) DEFAULT 'C' CHECK ([loca_type] ='C')
);

ALTER TABLE [dbo].[cont_contract] ADD CONSTRAINT [FK_dbo.cont_contract_dbo.loca_location_cust_id] 
                    FOREIGN KEY ([loca_id_customer],[loca_type]) REFERENCES [dbo].[loca_location] ([loca_id], [loca_type]);