다른 테이블을 참조하지 않고 열에 제약 조건을 넣을 수 있습니까?
-
20-09-2019 - |
문제
3 개의 가능한 문자열 중 하나만 있어야하는 텍스트 열이 있습니다. 그것에 제약 을가하려면 다른 테이블을 참조해야합니다. 대신 다른 테이블을 참조하지 않고 열에 구속 조건 값을 직접 넣을 수 있습니까?
해결책
이것이 있다면 SQL 서버, 신탁, 또는 PostgreSQL, 예, 당신은 a를 사용할 수 있습니다 check constraint
.
MySQL이라면 check constraint
S는 인식되지만 시행되지는 않습니다. 당신은 사용할 수 있습니다 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'))