하나의 명령으로 외래 키 제약 조건을 가진 새 열 추가


128

외래 키가 될 새 열을 추가하려고합니다. 두 가지 별도의 ALTER TABLE명령을 사용하여 열과 외래 키 제약 조건을 추가 할 수있었습니다 .

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

두 개의 ALTER TABLE 명령 대신 두 개의 ALTER TABLE 명령을 사용하여이를 수행하는 방법이 있습니까? 나는 작동하는 것을 생각 해낼 수 없었다.


답변:


185

SQL 관련 질문과 마찬가지로 DBMS에 따라 다릅니다. 일부 DBMS에서는 ALTER 테이블 조작을 쉼표로 구분하여 결합 할 수 있습니다. 예를 들어 ...

Informix 구문 :

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

IBM DB2 LUW 의 구문 은 유사하며 키워드 ADD를 반복하지만 (다이어그램을 올바르게 읽으면) 추가 된 항목을 구분하기 위해 쉼표가 필요하지 않습니다.

Microsoft SQL Server 구문 :

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

다른 일부에서는 ALTER TABLE 작업을 이와 같이 결합 할 수 없습니다. 표준 SQL은 ALTER TABLE 문에서 단일 조작 만 허용하므로 표준 SQL에서는 두 단계로 수행해야합니다.


5
두 번째 추가 및 제한.
Imran

18
SQL 부분의 경우 제약 조건의 이름을 지정하려면 다음과 같이 작성하십시오. ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut

78

MS-SQLServer에서 :

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

이것이 어떤 DB 엔진입니까?
knocte

@knocte 그것은 MS SQL 서버에 대한 것입니다-질문은 명확하게 태그됩니다
sqladmin

허용 대답은 이미 그것을 수행하는 방법에 DB 엔진 사이에 큰 차이가 있다는 주장으로 난 그냥 그했다, 그래서 무엇을 명확히해야 할 것은, 당신의 대답은, 질문의 요구를 명확히 생각하지 않는다
knocte을

9
제약 조건의 이름을 지정합니다. 허용 된 답변을 통해 시스템은 이름을 생성 할 수 있으며, 이는 나중에 관리하기가 어렵고 어렵습니다.
Derpy

17

SQL Server의 경우 다음과 같아야합니다

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

1
이것은 다른 답변보다 약간 간결합니다.
Sam

11

에서 MS SQL 서버 :

사용자 정의 외래 키 이름

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

사용자 정의 외래 키 이름이없는 경우

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);


2

2020 업데이트

꽤 오래된 질문이지만 사람들은 여전히 ​​내가보고있는 것으로 돌아갑니다. 위의 답변이 도움이되지 않은 경우 새 테이블에 다른 테이블의 ID와 동일한 데이터 유형을 사용하고 있는지 확인하십시오.

필자의 경우 Laravel을 사용하고 있으며 음수 ID LOL이 없다는 점이 없으므로 모든 ID에 대해 "부호없는 정수"를 사용합니다.

따라서 원시 SQL 쿼리는 다음과 같이 변경됩니다.

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

나는 그것이 도움이되기를 바랍니다


1
"ADD CONSTRAINT"는 "CONSTRAINT"여야합니다.
TimH

1

SQL Server에서 아래와 같이 할 수 있습니다

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)


1

ALTER TABLE TableName ADD NewColumnName INTEGER, FOREIGN KEY(NewColumnName) REFERENCES [ForeignKey_TableName](Foreign_Key_Column)


1

DB2의 경우 구문은 다음과 같습니다.

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);

0

테이블에 이미 일부 행이있는 경우 기본값을 추가 해야하는 경우 DEFAULT val 을 추가하십시오.

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);

0

이 시도:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

1
SO에 오신 것을 환영합니다! 답변이 코드 일 때 의견을 말하십시오. 귀하의 경우 귀하의 답변과 매우 유사한 답변이 많이 있으므로 귀하의 혜택을 공개하십시오.
David García Bodego 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.