2009-05-28 7 views
3

몇 가지 웹 검색 및 이에 대한 응답을 보았지만보기와 관련된 것으로 보입니다.null 또는 고유 일련을 허용하는 열을 어떻게 만들 수 있습니까?

NULL 또는 고유 값만 허용하도록 열을 조정하려면 어떻게해야합니까?

내 경우에는 서버 항목에만 일련 번호가있는 재고 항목이있는 테이블이 있습니다. 나머지는 null입니다. 나는 같은 연재물을 입력하는 것에 대해 어떤 종류의 통제를 시행하고 싶다.

또한 여전히 라이브 사이트에 새로운 프런트 엔드를 작성하면서 아키텍처를 다시 디자인 할 수 없습니다.

+3

어떤 RDBMS를 사용하고 있습니까? – Quassnoi

+0

Microsoft SQL Server (Visual Studio를 통해서만 액세스 가능) –

답변

0

프런트 엔드에서 유효성을 검사 할 수 있습니까? 데이터를 삽입하거나 커밋하기 전에 고유하거나 NULL인지 확인하십시오.

+0

깨끗하게 유지하려면 가장 간단한 솔루션 –

+0

데이터베이스 규칙을 항상 적용하는 것이 좋습니다. 데이터의 프런트 엔드에만 의존해서는 안됩니다. 청렴. 벨트 + 브레이스. – niico

6

MySQL에서도 UNIQUE 열은 Null을 허용하며 모든 엔진에서 Null을 허용합니다. 따라서 MySQL을 사용하는 경우 관심있는 열에 UNIQUE 제약 조건을 추가하면됩니다. 이 동작은 SQL 표준이며 PostgreSQL과 SQLite에서도 지원됩니다 (물론 확인할 수는 없지만 단일 열 UNIQUE 제약 조건에만 해당).

그러나이 SQL 표준 동작은 SQL Server 나 DB2와 같은 다른 모든 RDBMS 엔진에서 반드시 작동하지는 않습니다. 지원해야하는 엔진을 지정하면 더 구체적인 제안을 제공 할 수 있습니다.

+0

또한 PostgreSQL은이 동작을 지원합니다. –

+0

맞아요, SQLite와 오라클도 대답의 첫 번째 단락에서 말했듯이, SQL 표준 행동은 항상 "검은 양"이긴하지만, 결국 _is_입니다 .-). –

4

SQL ServerNULL 값을 허용하는 UNIQUE 색인을 만들 수 있지만 약간의 트릭이 필요합니다.

에만 비 NULL 열을 선택하는 뷰를 작성하고 뷰에 UNIQUE INDEX를 만들 : 대신 테이블의보기에 INSERT 's 및 UPDATE 년대를 수행해야합니다

CREATE VIEW myview 
AS 
SELECT * 
FROM mytable 
WHERE mycolumn IS NOT NULL 

CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn) 

주 .

지수에게 ...

CREATE TRIGGER trg_mytable_insert ON mytable 
INSTEAD OF INSERT 
AS 
BEGIN 
     INSERT 
     INTO myview 
     SELECT * 
     FROM inserted 
END 
+0

에는 2k5 서버가 없지만 고유 인덱스가있는 정수 열과 2k에 대한 빠른 테스트 및 널 (null) 허용은 두 번째 값을 추가하지 못하도록합니다. 예 : 1,2, , 4,5 == GOOD/1,2, , 4,5, == 허용되지 않음 –

+0

다중 NULL이 아닙니다. SQL Server는 SQL Server 구현 후 도입 된 ANSI SQL을 준수하지 않습니다. https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=299229 –

+0

물론 확실하지만 :) 어찌 되었든! – Quassnoi

0

당신은 대신 트리거와 함께 할 수있는 열을하지만, 고유 제한 조건없이 스틱을 널 (null) 에게 트리거를 허용 :

당신은 INSTEAD OF 트리거와 함께 할 수 있습니다 INSERT 및 UPDATE에서 삽입하려는 열 값이 NULL이거나 테이블에 이미 존재하지 않는지 확인하십시오.

0

어떤 데이터베이스를 사용하고 있는지 잘 모르겠습니다. g이지만, Postgres에서는 특별한 값을 반환하여 삽입을 거부 할 수있는 "before insert or update"트리거를 정의 할 수 있습니다. 네이티브 방법이 없다면 테이블에 이와 같은 제약 조건을 적용 할 수 있습니다.

0

어떤 플랫폼입니까?

SQL Server의 경우 인덱스 된보기를 사용하는 기술을 보여주는 blog post을 참조하십시오.

2

MS SQL Server 을 사용하는 경우 필터링 된 고유 색인을 사용하여이를 수행 할 수 있습니다. 자세한 내용은 this forum thread을 참조하십시오.

+2

여기에 WHERE 부분이 포함 된 문서가 있습니다. http://improvingsoftware.com/2010/03/26/creating-a-unique-constraint-that-ignores-nulls-in-sql-server/ – MattB

0

SQL Server 2008의 경우 여기 MattB가 연결된 필터링 된 인덱스 솔루션의 복사본이 있습니다. 나는 사람들이 그것을 놓치지 않도록하기 위해 여기에 적는다 :

CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls] 
ON [Customers] (SSN) 
WHERE [SSN] IS NOT NULL 
관련 문제