Как создать составной ключ и как ссылаться на него в другой таблице как на внешний ключ - PullRequest
1 голос
/ 05 декабря 2009

У меня есть таблица, следующая таблица

create table tblcountry (
  unqid uniqueidentifier 
  name varchar(100)
  isremoved bit
)

Я хочу создать первичный ключ на основе unqid + isremoved, в котором isremoved должно быть истинным

У меня есть другой стол:

create table tblstate (
  unqid uniqueidentifier,
  name varchar(100)
  f_tblcountry uniqueidentifier,
  isremoved bit
)

главное, что я хочу, чтобы при попытке сделать isremoved поле равным true или 1 для tabcountry, это должно выдать ошибку, если я использовал его в tabstate ссылочной таблицы и запись, для которой оно использовало свое поле isremoved, не правда. и если tabstate isremoved имеет значение true для этого первичного ключа, то его не должно выдавать ошибку.

Ответы [ 3 ]

1 голос
/ 05 декабря 2009

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

select * from tblcountry 
5CF96D52-994B-45E3-9CF9-1BC948280E57    india   0
AC2AB153-7FBA-48BC-911B-74A178C74FB5    pak 0
763D2186-68BF-4334-AAA1-CCE16E14E6B1    us  0

когда я вставляю в tabstate как запрос ниже

insert INto tblstate values (NEWID(),'raj','5CF96D52-994B-45E3-9CF9-1BC948280E57',0)

Я получаю следующую ошибку:

Сообщение 547, уровень 16, состояние 0, строка 1 Оператор INSERT конфликтует с ограничением FOREIGN KEY "fk". Конфликт произошел в базе данных "usecomp", таблица "dbo.tblcountry". Заявление было прекращено.

1 голос
/ 05 декабря 2009

Я хочу создать первичный ключ на основе unqid + isremoved, в котором isremoved должно быть истинным

Что касается значений, то первичный ключ гарантирует, что они уникальны. Когда первичный ключ является составным, состоящим из нескольких столбцов, это означает, что ключ представляет собой любую уникальную комбинацию всех задействованных столбцов. Это означает, что если первичный ключ - и unqid, и isremoved - в вашей таблице будут следующие строки:

UNQID                                  |   ISREMOVED
---------------------------------------------------------------
6F9619FF-8B86-D011-B42D-00C04FC964FF   |   1
6F9619FF-8B86-D011-B42D-00C04FC964FF   |   0

Ваш первичный ключ должен не включать столбец isremoved.

... когда я пытаюсь установить значение поля isremoved равным true / 1 в таблице tblcountry, я получаю сообщение об ошибке, если использую его в ссылочной таблице tblstate, если его поле 'isremoved не является правда. и если tabstate isremoved имеет значение true для этого первичного ключа, то его не должно выдавать ошибку.

Для этого вам потребуется ссылка на внешний ключ, связывающая столбцы unqid и isremoved в столбцах tblcountry с столбцами unqid и isremoved в таблице tblstate.

ALTER TABLE tblcountry 
  ADD CONSTRAINT tstate_fk FOREIGN KEY (unqid, isremoved) references tblstate (unqid, isremoved)

У Джошуа была правильная идея, неправильное направление.
Но это означает, что для вставки записи в tblcountry вы должны иметь значение unqid уже в tblstate. Столбец с ограничением внешнего ключа может иметь значение NULL - значение NULL не будет отменять ограничение внешнего ключа - но вы не можете указать часть внешнего ключа. Либо вы удовлетворяете внешний ключ, либо нет.

Мне неясно, что вы надеялись смоделировать - если бы у меня была лучшая идея, я бы предоставил альтернативы.

0 голосов
/ 05 декабря 2009
create table tblcountry (
  unqid uniqueidentifier,
  name varchar(100),
  isremoved bit,
  PRImARY KEY (unqid, isremoved)
)


create table tblstate (
    unqid uniqueidentifier,
    name varchar(100),
    f_tblcountry uniqueidentifier,
    isremoved bit,
  )

  CREATE INDEX tblstateref ON tblstate (unqid, isremoved) -- always use index w/ foreign keys

  ALTER TABLE tblstate ADD CONSTRAINT fk FOREIGN KEY (unqid, isremoved) references tblcountry (unqid, isremoved)
...