다른 테이블을 참조하지 않고 열에 제약 조건을 넣을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1352538

  •  20-09-2019
  •  | 
  •  

문제

3 개의 가능한 문자열 중 하나만 있어야하는 텍스트 열이 있습니다. 그것에 제약 을가하려면 다른 테이블을 참조해야합니다. 대신 다른 테이블을 참조하지 않고 열에 구속 조건 값을 직접 넣을 수 있습니까?

도움이 되었습니까?

해결책

이것이 있다면 SQL 서버, 신탁, 또는 PostgreSQL, 예, 당신은 a를 사용할 수 있습니다 check constraint.

MySQL이라면 check constraintS는 인식되지만 시행되지는 않습니다. 당신은 사용할 수 있습니다 enum, 그렇지만. 쉼표로 구분 된 목록이 필요한 경우 set.

그러나 이것은 유지하기가 쉽지 않기 때문에 일반적으로 눈살을 찌푸립니다. 조회 테이블을 만들고이를 통해 참조 무결성을 보장하는 것이 가장 좋습니다.

다른 팁

다른 언급이 언급 한 체크 제약 조건 및 열거 데이터 유형 외에도 원하는 제한을 시행하기 위해 트리거를 작성할 수도 있습니다.

반드시 방아쇠를 추천하는 것은 아닙니다 좋은 해결책, 나는 조회 테이블을 참조하지 않는 기준을 충족하는 다른 옵션을 지적하고 있습니다.

내 습관은 규칙이 단순히 열을 유한 한 값 세트로 제한하는 경우 제약 조건이나 트리거를 사용하는 대신 조회 테이블을 정의하는 것입니다. 조회 테이블에 대한 점검의 성능 영향은 점검 제약 또는 트리거를 사용하는 것보다 나쁘지 않으며 값 세트가 때때로 변경 될 때 관리하기가 훨씬 쉽습니다.

또한 일반적인 작업은 허용 값 세트 (예 : 사용자 인터페이스에서 양식 필드를 채우는 것)를 쿼리하는 것입니다. 허용 된 값이 조회 테이블에있을 때, 확인 제한 조건 또는 열거 정의에서 문자 값 목록에 정의 된 것보다 훨씬 쉽습니다.


"ID없이 조회하는 방법"

CREATE TABLE LookupStrings (
  string VARCHAR(20) PRIMARY KEY
);

CREATE TABLE MainTable (
  main_id INT PRIMARY KEY,
  string VARCHAR(20) NOT NULL,
  FOREIGN KEY (string) REFERENCES LookupStrings (string)
);

이제 당신은 가치가 없다는 것을 확신 할 수 있습니다 MainTable.string 참조 무결성이 그것을 막기 때문에 유효하지 않습니다. 그러나 당신은 가입 할 필요가 없습니다 LookupStrings 문자열을 얻으려면 테이블을 쿼리 할 때 MainTable:

SELECT main_id, string FROM MainTable;

보다? 가입 없음! 그러나 당신은 문자열 값을 얻습니다.


여러 외국 키 열에 대해 다시 의견 :

두 개의 개별 외국 키가있을 수 있으며, 각각은 조회 테이블에서 다른 행을 가리킬 수 있습니다. 외국 키 열의 참조 테이블의 열과 동일하게 이름을 지정할 필요는 없습니다.

내 일반적인 예는 버그 추적 데이터베이스로, 한 사용자가 버그를보고했지만 다른 사용자가 고정하도록 할당했습니다. 둘 다 reported_by 그리고 assigned_to 외국 키는 다음을 참조합니다 Accounts 테이블.

CREATE TABLE Bugs (
  bug_id INT PRIMARY KEY,
  reported_by INT NOT NULL,
  assigned_to INT,
  FOREIGN KEY (reported_by) REFERENCES Accounts (account_id),
  FOREIGN KEY (assigned_to) REFERENCES Accounts (account_id)
);

~ 안에 Oracle, SQL Server 그리고 PostgreSQL, 사용 CHECK 강제.

CREATE TABLE mytable (myfield INT VARCHAR(50) CHECK (myfield IN ('first', 'second', 'third'))

~ 안에 MySQL, 사용 ENUM 데이터 형식:

CREATE TABLE mytable (myfield ENUM ('first', 'second', 'third'))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top