Eine Variation der Antwort von @ a_horse_with_no_name besteht darin, zuerst die Tabelle mit der Einschränkung zu erstellen und dann in die Tabelle einzufügen, wobei immer noch eine Transaktion verwendet wird, sodass bei Verstößen gegen die Einschränkung alles zurückgesetzt wird. Dies sollten Sie berücksichtigen, wenn die einzufügenden Zeilen viel sind (dh Hunderttausende oder Millionen).
Wenn es schwierig ist, die create table
Anweisung dynamisch zu erstellen , können Sie diesen Teil in zwei Anweisungen unterteilen:
begin transaction ;
create table new_table -- create the table
as
select v.*
from (select ....) as v -- as before
where false ; -- but insert 0 rows
alter table new_table add constraint ... ; -- add the constraint
insert into new_table -- and then attempt
select ... ; -- the insert
end ;
Der Unterschied zur anderen Methode besteht darin, dass die Einschränkung vorhanden ist, bevor eine Zeile in die Tabelle eingefügt wird. Und da NOT NULL
und CHECK
Einschränkungen nicht aufschiebbar sind, sondern immer sofort überprüft werden, wenn eine Zeile eingefügt oder geändert wird (und nicht am Ende der Anweisung), schlägt Ihre Einfügeanweisung mit der ersten Zeile, die gegen die Einschränkung (en) verstößt, fehl (und wird zurückgesetzt) platziert haben.
Wenn Sie mehrere Millionen Zeilen einfügen, ist dies schneller, sowohl weil ein Fehler möglicherweise schneller gefunden wird, als auch weil weniger Einfügungen rückgängig gemacht werden müssen.