2017-01-25 2 views
1

Итак, если «Тип» равен 0, я должен иметь возможность добавить своего человека в таблицу B, иначе нет, но столбец «Тип» не является и не должен находиться в таблице B. enter image description hereОграничение проверки SQL на несколько таблиц

+0

'Вместо of' триггер может быть полезным для вас –

ответ

0

Вы можете сделать это с ограничением внешнего ключа и некоторыми обманами.

Во-первых, создать уникальное ограничение на TableA как для type и person:

alter table TableA add constraint unq_TableA_type_person on TableA(type, person); 

Это позволяет набор для настройки внешнего ключа. Однако вам нужна колонка type. Для этого вы можете использовать вычисляемый столбец:

alter table TableB add type_for_a as (0); -- it is always 0 

Теперь просто использовать ограничение внешнего ключа:

alter table TableB add constraint fk_tableA_type_person 
    foreign key (type_for_a, person) references tableA(type, person); 

вуаля! У вас есть ограничение, без необходимости писать код.

+0

я немного запутался ... Так что в основном на' изменить таблицу TableB добавить ограничение fk_tableA_type_person иностранный ключ (type_for_a, человек) reference tableA (тип, лицо); 'часть кода, я делаю внешний ключ с двумя столбцами ?? – bethe

+0

не существует чего-то более простого idk ... 'псевдокод' IF TABLE A CELL X = 0 LET IT PASS IN, OTHERWISE DON'T' – bethe

+0

Я думаю, что забыл упомянуть, что« Тип »не существует в другая таблица – bethe

0
CREATE TABLE T1 (TypeID INT NOT NULL, people VARCHAR(50)); 
GO 
CREATE TABLE T2 (people VARCHAR(50)); 
GO 


-- creating trigger to insert on the behalf when there is a particular type 
CREATE TRIGGER dbo.AfterInsertTrigger 
    ON T1 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    declare @id int, 
    @someval char(1) 
    insert into dbo.T2 
    select i.people FROM Inserted i 
    where i.TypeID=0 -- checks only when the id is 0 
END 
GO 

-- inserting people with different id s into Table1 
INSERT T1 (TypeID, people) SELECT 1, 'A'; 
INSERT T1 (TypeID, people) SELECT 0, 'B'; 
GO 

--selecting from tables see what got affected. 
select * from T1 
select *from T2 

enter image description here

--Clean up 
    DROP TABLE T2; 
    DROP TABLE T1; 
    GO 
+0

небольшое объяснение было бы полезно :) – bethe

+0

@bethe, пожалуйста, дайте мне знать, если это имеет смысл. –

+0

в моем случае FKID не должен существовать в T2 – bethe

Смежные вопросы