Обсуждение: ENABLE/DISABLE CONSTRAINT NAME

Поиск
Список
Период
Сортировка

ENABLE/DISABLE CONSTRAINT NAME

От
wangshuo@highgo.com.cn
Дата:
Hi hackers,

       In order to achieve enable/disable constraint name,I made ​​a few
modifications to the code.

       First, someone used to build the constraints while building
table. Then inserting data must follow a certain order.
       And people usually like to insert the data but not affected by
foreign keys or check.

       Second, the check or the foreign key constraint will waste much
time while inserting the data into the table.

       Due to the above reasons,I realized this command.

       I add a field named 'conenabled' to pg_constraint, identifying
whether a constraint is enable or not;
       I enable or disable a foreign key constraint, by enable or
disable the triggers of the foreign key;
       Our database will depend on the value of 'conenabled' to use the
check constrint or not;

       I think the internal trigger's naming can be changed,and the
function ATExecValidateConstraint can be changed too,
       but I think that together we can discuss, to decide what to do.

Now,we can do those:

Syntax:
      alter table disable constraint <constraint_name> ;
      alter table enable constraint <constraint_name> [ no valid ];
      alter table add constraint table_constriant [ disable ];

       CREATE TABLE aa
(
a1 INT CHECK(a1>4),
a2 INT
);
ALTER TABLE aa ADD CONSTRAINT aa_a2_check CHECK(a2>10) DISABLE;
INSERT INTO aa VALUES (10,1);
DELETE FROM aa;
ALTER TABLE aa DROP CONSTRAINT aa_a2_check;

ALTER TABLE aa DISABLE CONSTRAINT aa_a1_check;
INSERT INTO aa VALUES (5,2);
UPDATE aa SET a1=2 WHERE a2=2;
INSERT INTO aa VALUES (1,1);
ALTER TABLE aa ENABLE CONSTRAINT aa_a1_check NOT VALID; //don't
validate the data
DELETE FROM aa;
ALTER TABLE aa DISABLE CONSTRAINT aa_a1_check;
ALTER TABLE aa ENABLE CONSTRAINT aa_a1_check;   //validate the data

CREATE TABLE bb
(
b1 INT PRIMARY KEY,
b2 INT
);
CREATE TABLE cc
(
c1 INT REFERENCES bb(b1),
c2 INT
);

ALTER TABLE cc DISABLE CONSTRAINT cc_c1_fkey;
INSERT INTO cc VALUES (1,1);
INSERT INTO bb VALUES (2,2);
INSERT INTO cc VALUES (2,2);
UPDATE cc SET c1=1 WHERE c2=2;
ALTER TABLE cc ENABLE CONSTRAINT cc_c1_fkey NOT VALID;   //don't
validate the data
ALTER TABLE cc DISABLE CONSTRAINT cc_c1_fkey;
DELETE FROM cc;
ALTER TABLE cc ENABLE CONSTRAINT cc_c1_fkey;  //validate the data



I packed a patch about this modification.This is my first time to send
the patch,
I hope you give me some advice.

      Best Regards!

      Yours,
      Wang Shuo
      HighGo Software Co.,Ltd.
      August 30, 2013

Вложения

Re: ENABLE/DISABLE CONSTRAINT NAME

От
Tom Lane
Дата:
wangshuo@highgo.com.cn writes:
>        In order to achieve enable/disable constraint name,I made ​​a few 
> modifications to the code.
>        First, someone used to build the constraints while building 
> table. Then inserting data must follow a certain order.
>        And people usually like to insert the data but not affected by 
> foreign keys or check.
>        Second, the check or the foreign key constraint will waste much 
> time while inserting the data into the table.
>        Due to the above reasons,I realized this command.

Uh ... why not just drop the constraint, and re-add it later if you want
it again?  This seems like adding a lot of mechanism (and possible bugs)
for a rather marginal use-case.
        regards, tom lane



Re: ENABLE/DISABLE CONSTRAINT NAME

От
Fabien COELHO
Дата:
> Uh ... why not just drop the constraint, and re-add it later if you want
> it again?

My 0.02€ : maybe because you must keep track of the constraint details to 
do so, this it is significantly more error prone than disable / enable 
when the bookkeeping is done by the system and if everything is in a 
transaction... If the ENABLE is automatically done on the next COMMIT, 
that would be even better.

> This seems like adding a lot of mechanism (and possible bugs) for a 
> rather marginal use-case.

That is possible!

-- 
Fabien.

Re: ENABLE/DISABLE CONSTRAINT NAME

От
wangshuo@highgo.com.cn
Дата:
于 2013-08-30 21:27, Tom Lane 回复:
> wangshuo@highgo.com.cn writes:
>>        In order to achieve enable/disable constraint name,I made ​​a 
>> few
>> modifications to the code.
>>        First, someone used to build the constraints while building
>> table. Then inserting data must follow a certain order.
>>        And people usually like to insert the data but not affected 
>> by
>> foreign keys or check.
>>        Second, the check or the foreign key constraint will waste 
>> much
>> time while inserting the data into the table.
>>        Due to the above reasons,I realized this command.

Tom Lane <tgl@sss.pgh.pa.us> writes:
> Uh ... why not just drop the constraint, and re-add it later if you 
> want
> it again?

Thanks for your reply.

If you drop the constraint,you must record the sql of the constraint.
ENABLE/DISABLE just turn off or trun on that.The sql2008 support this.

And, Oracle,DB2,SQL Server,MySQL all support this feature, new users 
ever used Oracle are accustomed to
use, besides, this feature benefits data migration, so we have enough 
reasons to
add this feature.

> This seems like adding a lot of mechanism (and possible bugs)
> for a rather marginal use-case.
>
>             regards, tom lane


I changed the pg_constraint system table , the  ConstrCheck struct, the
CreateTrigger function, the  CreateConstraintEntry function and some 
grammars.
I have passed the pgtest,and this may has some bugs.

I refer to the validation feature to do this feature.
The validation feature only works while adding constraint,
my work is a supplement to the validation feature.
If possible, I would like to merge the two features together.

For all above, I wrote this letter to community, to let more people to 
talk about
this and correct possible bugs.


     Wang Shuo     HighGo Software Co.,Ltd.     September 1, 2013