2011-11-05 4 views
0

저는 이것이 다소 기본적인 것으로 알고 있으며, 꽤 오랫동안 답을 찾았지만 문제가 있습니다.외부 키를 열의 값으로 삽입하는 방법

여기서 코딩하는 방법을 모르지만 여기에 있습니다. 여기

는 문제의 테이블을 만들기위한 쿼리 :

CREATE TABLE customer 
( customer_id INT NOT NULL CONSTRAINT customer_pk PRIMARY KEY IDENTITY, 
    first_name VARCHAR(20) NOT NULL,  
    surname VARCHAR(20) NOT NULL,  
    dob DATETIME NOT NULL,  
    home_address VARCHAR(50) NOT NULL,  
    contact_number VARCHAR(10) NOT NULL,  
    referrer_id INT NULL FOREIGN KEY REFERENCES customer(customer_id), 
); 

을 그리고 문제는 여기에 코드입니다 : (. 마지막에 8 값을 특히 라인)

--fill customer table 
INSERT INTO customer 
VALUES ('Harold', 'Kumar', '2010-07-07 14:03:54', '3 Blue Ln, Perth', 0812391245, NULL) 
INSERT INTO customer 
VALUES ('Bingo', 'Washisnameoh', '2010-09-21 12:30:07', '3 Red St, Perth', 0858239471, NULL) 
INSERT INTO customer 
VALUES ('John', 'Green', '2010-11-07 14:13:34', '4 Blue St, Perth', 0423904823, NULL) 
INSERT INTO customer 
VALUES ('Amir', 'Blumenfeld', '2010-11-01 11:03:04', '166 Yellow Rd, Perth', 0432058323, NULL) 

INSERT INTO customer 
VALUES ('Hank', 'Green', '2010-07-07 16:04:24', '444 Orange Crs, Perth', 0898412429, 8) 

두 번째 쿼리를 실행할 때 다음과 같이 응답합니다.

메시지 547, 수준 16, 상태 0, 줄 1
외래 키 같은 테이블 제약 "FK_ 고객 _referr__5772F790"와 충돌 INSERT 문. 데이터베이스 "master", 테이블 "dbo.customer", 열 'customer_id'에서 충돌이 발생했습니다. 명세서 이 종료되었습니다.

감사합니다.

+0

이 SQL Server입니까? master라는 데이터베이스가 있습니까? – Icarus

+1

실수로 테이블을 마스터로 실행 했습니까? –

+0

@marc_s 감사합니다. 다음에 그 일을 할 것입니다. – Owen

답변

4

1) 당신 customer_id에 기본 키가 있고 insert 문에 고객 ID 값이 없습니다.

2) 고객 참조를 참조하는 referrer_id 형식의 자체 참조 외래 키가 있습니다. null이 아닌 referrer_id가있는 레코드를 삽입하는 경우 '8'인 경우 customer_id가 '8'인 레코드를 이미 삽입했는지 확인하십시오.

1

referrer_id이 8이되어야한다는 것을 어떻게 알 수 있습니까 ?? 당신이해야 할 일은

삽입 한 customer_id의 값을 잡을이며, 다음 두 번째 쿼리에서 것을 사용 :

DECLARE @referToID INT 

INSERT INTO dbo.Customer(first_name, surname, dob, home_address, contact_number, referrer_id) 
VALUES ('Harold', 'Kumar', '2010-07-07 14:03:54', '3 Blue Ln, Perth', 0812391245, NULL) 

SELECT @ReferToID = SCOPE_IDENTITY() ; -- catch the newly given IDENTITY ID 

INSERT INTO dbo.Customer(first_name, surname, dob, home_address, contact_number, referrer_id) 
VALUES ('Hank', 'Green', '2010-07-07 16:04:24', '444 Orange Crs, Perth', 0898412429, @ReferToID) 

난 당신이 참조 할 줄 모른다 (당신은 'didn를 t)는 지정 -하지만 난 당신이 메커니즘을 이해 바랍니다 :

  • 이 테이블에 새 행을 삽입을
  • SCOPE_IDENTITY
  • ,536,913,632를 사용하여 새로 삽입 된 ID를 얻을 수 10
  • SCOPE_IDENTITY

업데이트에 의해 반환 된 그 값을 첫 번째 행을 참조하는 다음 행을 삽입하고 사용를 정말 주어진 행 참조 자체 (이상한 개념을 갖고 싶어 .....), 당신은 두 단계로 그것을 할 필요 할 걸요 :

  • 이 테이블에 새 행을 삽입
  • 얻을 행이 referrer_id
  • 을 설정하는 SCOPE_IDENTITY
  • 업데이트를 사용하여 새로 삽입 된 ID 이 같은

뭔가 :

DECLARE @NewCustomerID INT 

INSERT INTO dbo.Customer(first_name, surname, dob, home_address, contact_number) 
VALUES ('Hank', 'Green', '2010-07-07 16:04:24', '444 Orange Crs, Perth', 0898412429) 

SELECT @NewCustomerID = SCOPE_IDENTITY() ; -- catch the newly given IDENTITY ID 

UPDATE dbo.Customer 
SET referrer_id = @NewCustomerID 
WHERE customer_id = @NewCustomerID 
+0

아, 외래 키는 이것이 자기 참조 엔티티로 만드는 것입니다. 미안해서는 안됩니다. – Owen

+0

@Owen : 예, 물론입니다. 그러나 행이 실제로 자체를 참조 할 수는 없습니다. 행에 대한 행은 고객 테이블의 다른 행을 참조합니다. –

+0

예, 다른 행만 참조 할 수는 없습니다. 고객이 다른 신규 고객을 추천하는 경우입니다. – Owen

0

유일한 문제는 ID가 있어야한다는 것입니다. 첫 번째 1이 시작점이고 1이 자동 시드 번호 인 Identity (1,1)과 같은 시드 값 ... 다시 삽입 문을 실행하십시오.

관련 문제