[SQL] 점검 제한 조건에 하위 쿼리
SQL점검 제한 조건에 하위 쿼리
나는 SQL-Server 2008 R2의 설계 테이블이 있습니다.
I는 데이터가 삽입 될 때 다른 테이블에 대해 검사 될 필요가 있다는 테이블의 열을 갖는다.
ALTER TABLE Table1
WITH CHECK ADD CONSTRAINT CK_Code
CHECK (MyField in (Select Field From Table2))
이 원인 오류
나는 체크 제약 조건에 대한이 질문에 보았다 - 하위 쿼리는이 컨텍스트에서 허용되지 않습니다.
트리거를 사용하지 않고이를 달성하는 방법이 있습니까?
해결법
-
==============================
1.참고, 당신이 정말로 원하는 것은 외래 키 제약 조건입니다. 그 다음, 쿼리를 포함하고 스칼라 값을 출력하는 기능을 쓸 수있는 체크로 "쿼리"를 얻을 점검 제한 조건에 해당 기능을 사용했다.
참고, 당신이 정말로 원하는 것은 외래 키 제약 조건입니다. 그 다음, 쿼리를 포함하고 스칼라 값을 출력하는 기능을 쓸 수있는 체크로 "쿼리"를 얻을 점검 제한 조건에 해당 기능을 사용했다.
CREATE FUNCTION myFunction ( @field DATATYPE(?) ) RETURNS VARCHAR(5) AS BEGIN IF EXISTS (SELECT* FROM Table2 WHERE MYFIELD = @field) return 'True' return 'False' END
뭐 그런. 검증되지 않은.
그런 다음과 같이 수표에 추가 할 수 있습니다
ALTER TABLE Table1 WITH CHECK ADD CONSTRAINT CK_Code CHECK (myFunction(MYFIELD) = 'True')
-
==============================
2.당신은 점검 제한 조건 안에 서브 쿼리를 가질 수 없습니다. 당신이 할 수있는 것은 UDF를 사용하다 반환하는 점검 제한 조건 내 스칼라 값.
당신은 점검 제한 조건 안에 서브 쿼리를 가질 수 없습니다. 당신이 할 수있는 것은 UDF를 사용하다 반환하는 점검 제한 조건 내 스칼라 값.
1 단계 : 테이블 만들기
USE CTBX GO CREATE TABLE RawMaterialByGender ( RMGID int primary key identity(1,1), RMID smallint foreign key references RawMaterialMaster(RMID), LeveLMasterID smallint foreign key references LevelMaster(LevelTextID), IsDeleted bit )
2 단계 : 스칼라를 반환하는 UDF를 작성
Create FUNCTION [dbo].[IsValidLevelMasterGender](@LevelMasterID smallint) RETURNS bit AS BEGIN DECLARE @count smallint; DECLARE @return bit; SELECT @count = count(LevelTextID) FROM [LevelMaster] WHERE LevelCategoryID = 3 AND IsActive = 1 AND LevelTextID=@LevelMasterID IF(@count = 0) SET @return = 'false'; ELSE SET @return = 'true'; RETURN @return; END; GO
3 단계 : 알터 테이블은 CHECK 제약 조건을 추가하는
ALTER TABLE RawMaterialByGender ADD CONSTRAINT check_LevelMasterID CHECK (dbo.IsValidLevelMasterGender(LeveLMasterID) = 'true')
-
==============================
3.
ALTER TABLE Table1 ADD CONSTRAINT FK_Table1_Code FOREIGN KEY (MyField) REFERENCES Table2 (Field) ;
참조 : http://msdn.microsoft.com/en-us/library/ms190273.aspx 참고 : 나는 구문 위를 확인하지 않았습니다.
-
==============================
4.먼저 귀하의 예제에서 모든 당신은 명확 FK 제약 조건이 필요합니다.
먼저 귀하의 예제에서 모든 당신은 명확 FK 제약 조건이 필요합니다.
또 다른있는 posibility은 CHECK OPTION을 함께보기를 사용하고 그것을 통해 사용자에게 액세스 권한을 부여하는 것입니다 :
CREATE TABLE Table1(i INT PRIMARY KEY, CK_Code CHAR(1)); CREATE TABLE Table2(Field CHAR(1)); INSERT INTO Table2(Field) VALUES ('A'),('B'), ('C'); GO CREATE VIEW v_Table1 AS SELECT * FROM Table1 WHERE CK_code IN (SELECT Field FROM Table2) -- here goes your subquery check WITH CHECK OPTION;
당신처럼 "제약 조건"을 위반하는 데이터를 삽입하려고하면
INSERT INTO v_Table1(i, CK_Code) VALUES(10, 'D');
당신은 얻을 것이다 :
LiveDemo
from https://stackoverflow.com/questions/13000698/sub-queries-in-check-constraint by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 두 날짜 사이의 모든 날짜를 가져옵니다 (0) | 2020.04.11 |
---|---|
[SQL] SQL에서 어떻게 각 그룹의 상위 2 행을 선택합니다 (0) | 2020.04.11 |
[SQL] DELIMITER //는 트리거에서 어떤 기능을 수행합니까? (0) | 2020.04.11 |
[SQL] LINQ를 검색 와일드 카드 (0) | 2020.04.11 |
[SQL] 날짜 범위 사이에 날짜를 얻기 (0) | 2020.04.11 |