SQL - Как вставить внешний ключ в качестве значения для столбца - PullRequest
0 голосов
/ 05 ноября 2011

Я знаю, что это довольно просто, и я довольно долго искал ответы, но я обеспокоен.

Я не знаю, как сделать мою кодировку доступной для чтения, но вот она.

Вот запрос для создания таблицы:

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),   
);

А вот код проблемы:

--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)

(В частности, строка со значением 8 в конце.)

При выполнении второго запроса он отвечает так:

Сообщение 547, Уровень 16, Состояние 0, Строка 1
Оператор INSERT противоречит с ограничением FOREIGN KEY SAME TABLE "FK_ клиент _referr__5772F790". Конфликт произошел в базе данных "master", таблица "dbo.customer", столбец "customer_id". Заявление было прекращено.

Благодарим вас за помощь.

Ответы [ 3 ]

4 голосов
/ 05 ноября 2011

1) У вас есть первичный ключ для customer_id - и ваши операторы вставки не имеют значения для идентификатора клиента

2) У вас есть собственный ссылочный внешний ключ в виде referrer_id со ссылкой на customer_id.Когда вы вставляете запись с referrer_id, который не равен нулю, в вашем случае, который равен '8', убедитесь, что вы уже вставили запись с customer_id '8'

1 голос
/ 05 ноября 2011

Откуда вы знаете, что 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)

Я не знаю, к какой строке вы хотите обратиться (вы не указали) - но я надеюсь, что вы понимаете механизм:

  • вставить новую строку в вашу таблицу
  • получить новый идентификатор, используя SCOPE_IDENTITY
  • вставить следующую строку, которая ссылается на эту первую строку, и использовать это значение, возвращаемое SCOPE_IDENTITY

Обновление: Если вы действительно хотите иметь данную ссылку на строку (странная концепция .....), то вам нужно сделать это в два этапа:

  • вставить новую строку в вашу таблицу
  • получить новый идентификатор, используя SCOPE_IDENTITY
  • обновить эту строку, чтобы установить referrer_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 голосов
/ 26 мая 2013

Единственная проблема, с которой вы здесь сталкиваетесь, заключается в том, что у идентификатора должно быть начальное значение, которое может быть таким же, как Identity (1,1), где первая 1 - это отправная точка, а send 1 - номер автоматического начального числа ... повторный запускВаше заявление вставки

...