0

このようなテーブルが与えられた場合、x と y には一意の制約があります。

id,x,y
1、1、1
2、1、2
3、2、3
4、3、5
..

UPDATE ステートメントを使用して、一連の行の値 x と y を一定量増やしたいと考えています。両方を 1 ずつ増やしているとします。UPDATE は id 順に従っているようで、1 2 で行を更新した後にエラーが発生します。これは、3、4 に更新されていない次の行 2 3 と衝突するためです。まだ。

グーグルで調べてみると、UPDATEに注文を強制的に使用させる方法が見つかりません。私のアプリケーションでは、逆にそれを行うだけで十分です。また、更新全体の後、セットが一貫していると確信しています。

解決策はありますか?注文を更新に強制する方法、または完了するまで制約チェックを延期する方法はありますか?

これは Django アプリケーション用であり、サポートされているすべてのデータベースと互換性があることを意図しています。一部のデータベースにはアトミック トランザクションがあり、この問題が発生しないことはわかっていますが、一部のデータベースにはこの問題を回避する機能がありますが、厳密に標準的な SQL ソリューションが必要です。

4

2 に答える 2

1

PostgreSQL の場合、主キー制約を「遅延可能」として定義すると、コミット時にのみ評価されます。

PostgreSQL では、これは次のようになります。

postgres=>create table foo (
postgres(>    id integer not null,
postgres(>     x integer,
postgres(>     y integer
postgres(>);
CREATE TABLE
postgres=>alter table foo add constraint pk_foo primary key (id) deferrable initially deferred;
ALTER TABLE
postgres=> insert into foo (id, x,y) values (1,1,1), (2,1,1), (3,1,1);
INSERT 0 3
postgres=> commit;
COMMIT
postgres=> update foo set id = id + 1;
UPDATE 3
postgres=> commit;
COMMIT
postgres=> select * from foo;
 id | x | y
----+---+---
  2 | 1 | 1
  3 | 1 | 1
  4 | 1 | 1
(3 rows)
postgres=>

Oracle の場合、UPDATE ステートメントを単一のアトミック操作として評価するため、これは必要ありません。

于 2012-04-16T17:12:57.983 に答える
0

参考までに、MS SQL Server はこれに関しても問題はありません。UPDATE は単一のアトミック操作です。

ALTER TABLE [table_name]
ADD CONSTRAINT unique_constraint
UNIQUE(x)

ALTER TABLE [table_name]
ADD CONSTRAINT unique_constraint2
UNIQUE(y)

update [table_name]
set x = x+1,
y = y+1

まったく問題ないはずです。

于 2012-04-16T18:35:31.740 に答える