2009-12-05 1 views
1

У меня есть таблица следующей таблицыКак создать составной ключ, и как передать его в другой таблице в качестве внешнего ключа

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 поле истинным или 1 из tabcountry, чем он должен дать мне ошибку, если я га вы использовали его в ссылочной таблице tabstate, и запись, к которой она использовала поле isremoved, неверна. и если tabstate isremoved истинно для этого первичного ключа, то это не должно приводить к какой-либо ошибке.

ответ

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

Я выполнил ваше решение, работая отлично.когда я вставляю данные в tabcountry, он позволяет мне вставлять, но когда я пытаюсь вставить в tabstate его выдачу ошибки – 2009-12-05 05:34:23

+0

все еще получаю ошибку: Msg 547, уровень 16, состояние 0, строка 1 выберите * из tblcountry BCB1C75D-B70C-4C6E -8A88-01E4624CBDD2 \t \t Ind 0 F2C50808-9206-47D8-A712-701886244535 \t \t пак 0 EA58024C-3B1A-4C59-8F56-AA7E8FD4436C \t \t Afganistan 0 вставка в значения tblstate (NEWID(), 'Раджастхана' , 'BCB1C75D-B70C-4C6E-8A88-01E4624CBDD2', 0) Оператор INSERT противоречил ограничению FOREIGN KEY "fk". Конфликт произошел в базе данных «usecomp», таблица «dbo.tblcountry». Заявление было прекращено. – 2009-12-05 06:01:44

1

Я выполнил ваше решение, работая отлично. когда я вставить данные в tabcountry сво дайте мне вставить, но когда я пытаюсь вставить в tabstate его giveing ​​меня ошибка

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) 

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

Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the FOREIGN KEY constraint "fk". The conflict occurred in database "usecomp", table "dbo.tblcountry". The statement has been terminated.

+0

Это потому, что ограничение обратное - оно должно быть применено к таблице tblcountry, ссылаясь на tblstate, чтобы вы могли добавлять строки в tblstate. –

1

I want to create primary key on basis of unqid + isremoved and in which isremoved must be true

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

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

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

...when I try to make the isremoved field value set to true/1 in the tblcountry table, I should get an error if I have used it in referenced table tblstate if its' isremoved field is not true. and if the tabstate the isremoved is true for that primary key than its should not give any error.

Чтобы сделать это, вам нужно внешнего ключа ссылку, связывающую 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, не будет отключать ограничение внешнего ключа, но вы не можете указать часть внешнего ключа. Либо вы удовлетворяете внешний ключ, либо нет.

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

+0

Получение следующей ошибки: Msg 1776, уровень 16, состояние 0, строка 1 В ссылочной таблице «tblstate» нет первичных или потенциальных ключей, которые соответствуют списку столбцов ссылок в внешнем ключе «tstate_fk». Msg 1750, уровень 16, состояние 0, строка 1 Не удалось создать ограничение. См. Предыдущие ошибки. – 2009-12-05 05:56:28

+0

, когда я запускаю код ur im, получая эту ошибку: Msg 1776, уровень 16, состояние 0, строка 18 В ссылочной таблице «tblstate» нет первичных или потенциальных ключей, которые соответствуют списку столбцов ссылок в внешнем ключе «tstate_fk» ». Msg 1750, уровень 16, состояние 0, строка 18 Не удалось создать ограничение. См. Предыдущие ошибки. – 2009-12-05 07:15:27

+0

Прежде чем создавать ограничение, вы должны иметь вспомогательные записи в 'tblstate'. –