2

ここで問題があります。次のスキーマのテーブルがあります。

id : int(11) not null primary key
name : varchar(255) not null
status : enum('ACTIVE','DELETED')

注: レコードは「ソフト削除済み」であり、ステータスに「削除済み」のフラグを立てるだけです。

問題は、db の既存のレコードが 'DELETED' 状態でない限り、2 つの異なるスレッドを介して同じ名前 (冗長) のエントリを作成できるようにしたくないということです。これを行うにはどのような方法がありますか?

「DELETED」に(同じ名前の)アイテムがあり、削除したいゾーンが「ACTIVE」の場合、ゾーンにフラグを立てるとエラーが発生するため、名前とステータスを一意にインデックス付けすることはできません「削除」されます。

4

2 に答える 2

3

データに deleted_at フィールドを追加するのはどうですか? 次に、name + status + deleted_at に一意のキーを設定できます。status = ACTIVE の場合、deleted_at の値は 1 つしかないため、一意性は名前のみになります。

明確にするために編集:

CREATE TABLE mytable (
  id int not null primary key,
  name varchar(255) not null,
  status enum('active','delete'),
  deleted_at datetime not null default 0,
  UNIQUE KEY one_active (name, status, deleted_at)
);

EDIT #2 : 実際には、status=deleted をチェックする代わりに、deleted_at > 0 をチェックする「削除されたかどうかをチェックする」コードを作成すると、ステータス フィールドは必要ありません。

于 2012-05-28T05:31:19.463 に答える
0

プログラムで目標を達成する必要があります。INSERT を制限するために、名前 + ステータス ACTIVE が存在するかどうかを言語で確認してください。

于 2012-05-28T05:19:44.727 に答える