2016-06-03 5 views
-1

연구소의 이름이 고유한지 확인하기 위해 프런트 엔드 코드를 사용하지 않고도 수정하려는 SQL Server 데이터베이스 테이블이 있습니다. 모든 삽입에 대한 SQL 코드 기반의 Linq를 설정합니다.다른 열을 기반으로 한 SQL 고유 열

CREATE TABLE [dbo].[institution] 
(
    [institutionID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [typeID] [tinyint] NOT NULL REFERENCES [dbo].[institutiontype]([institutiontypeID]), 
    [name] [varchar](255) NOT NULL UNIQUE, 
    [cityID] [int] NULL REFERENCES [dbo].[city]([cityID]), 
    [stateID] [int] NULL REFERENCES [dbo].[stateprovince]([stateID]), 
    [countryID] [int] NULL REFERENCES [dbo].[country]([countryID]), 
    [createby] [int] NOT NULL REFERENCES [dbo].[ipamuser]([ipamuserID]), 
    [createdatetime] [datetime] NOT NULL DEFAULT (GETDATE()), 
    [modifyby] [int] NULL REFERENCES [dbo].[ipamuser]([ipamuserID]), 
    [modifydatetime] [datetime] NULL, 
    [dataversion] [int] NOT NULL DEFAULT (0) 
) 

문제가되면, institutionname가 cityID, stateID과 countryID가 동일한 경우에만 고유해야 : ​​

는 여기에 내가 설정에 노력하고 새로운 테이블입니다. 같은 이름이 다른 도시, 주 또는 국가에 존재할 수있는 시대가 있기 때문에 고유로 institutename으로 테이블을 설정하면 필요를 충족시키지 못합니다. 나는 당신은 당신의 테이블에 복잡한 제약 조건을 작성해야이

+0

이 RDBMS는 무엇입니까? 태그를 추가하여 mysql, postgresql, sql-server, oracle 또는 db2 중 어느 것을 사용하는지 지정하십시오. –

+0

내용과 태그 모두 SQL 데이터베이스라는 것을 알았습니다. – mattgcon

+1

@mattgcon : ** 모든 ** 관계형 DBMS는 "SQL 데이터베이스"입니다. SQL은 DBMS 제품이 아닌 쿼리 언어입니다. 그러나 비표준 SQL에 대한 질문은 SQL Server (T-SQL) –

답변

1

를 해결 할 방법

. 필수 조건이 충족되면 true (BIT에서 1)를 반환하고 그렇지 않으면 false를 반환하는 사용자 정의 함수를 정의합니다. CHECK 제약 조건이있는 테이블 스키마에이 제약 조건을 넣습니다. 그냥 ([name], CityID, StateID, CountryID)에 UNIQUE 제약 조건 또는 인덱스를 넣어, 너무 복잡 아무것도 필요한 이유를 모르겠어요

CREATE FUNCTION dbo.fnIsNameUnique (
    @name [varchar](255), 
    @cityID int, 
    @stateID int, 
    @countryID int, 
) 
RETURNS tinyint 
AS 
BEGIN 
    DECLARE @Result tinyint 
    IF EXISTS(SELECT * FROM institution WHERE name = @name AND cityID = @cityID AND stateID = @stateID AND countryID = @countryID) 
    SET @Result= 0 
    ELSE 
    SET @Result= 1 
    RETURN @Result 
END 

CREATE TABLE [dbo].[institution] 
(
    [institutionID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [typeID] [tinyint] NOT NULL REFERENCES [dbo].[institutiontype]([institutiontypeID]), 
    [name] [varchar](255) NOT NULL UNIQUE, 
    [cityID] [int] NULL REFERENCES [dbo].[city]([cityID]), 
    [stateID] [int] NULL REFERENCES [dbo].[stateprovince]([stateID]), 
    [countryID] [int] NULL REFERENCES [dbo].[country]([countryID]), 
    [createby] [int] NOT NULL REFERENCES [dbo].[ipamuser]([ipamuserID]), 
    [createdatetime] [datetime] NOT NULL DEFAULT (GETDATE()), 
    [modifyby] [int] NULL REFERENCES [dbo].[ipamuser]([ipamuserID]), 
    [modifydatetime] [datetime] NULL, 
    [dataversion] [int] NOT NULL DEFAULT (0), 
    CONSTRAINT ckValidName CHECK (
    dbo.fnIsNameUnique(name, cityID, stateID, countryID) = 1) 
) 
) 
+0

고맙습니다. 빠른 질문입니다. "RETURNS"행이 "RETURNS int"가 아니어야합니까? – mattgcon

+0

예. 나는 해결책을 편집했다 –

+0

고마워. 그래서 이것을 이해하게 하소서. LINQ insert 문이 코드에서 실행될 때 constraint = 0이면 SQL 데이터베이스는 자동으로 레코드를 삽입하지만 제약 조건이 1을 반환하면 정확히 어떤 일이 발생합니까? 내가 코드면에서 어떤 것을 처리해야합니까? – mattgcon

0

는 당신이 필요로 말을한다.

관련 문제