74

既存のテーブルに複雑な一意キーを追加したい。キーには4つのフィールド(、、、)が含まuser_idれます。ただし、テーブルには一意でない行があります。重複する日付をすべて削除し、その後に複雑なキーを追加できることを理解しています。game_iddatetime

重複するデータをすべて検索せずに、別の解決策が存在する可能性があります。(一意の無視を追加するなど)。

私が検索したUPD、重複するmysql行を削除するにはどうすればよいですか?それは良い解決策だと思います。 MySQLクエリのみを使用して重複を削除しますか?

4

8 に答える 8

142

yAnTarのアドバイスに従って行うことができます

ALTER TABLE TABLE_NAME ADD Id INT AUTO_INCREMENT PRIMARY KEY

また

制約を追加できます

ALTER TABLE TABLE_NAME ADD CONSTRAINT constr_ID UNIQUE (user_id, game_id, date, time)

ただし、既存のデータを失わないようにするには、インデント列を追加してから複合キーを作成できます。

于 2013-03-06T19:17:11.633 に答える
27

適切な構文は次のようになります-ALTER TABLE Table_Name ADD UNIQUE (column_name)

ALTER TABLE  0_value_addition_setup ADD UNIQUE (`value_code`)
于 2016-10-04T10:19:37.230 に答える
10

私は同様の問題を解決しなければなりませんでした。私はMSAccessから、主キーを持たない15000近くのレコードを持つ大きなソーステーブルを継承しました。これを正規化して、CakePHPと互換性を持たせる必要がありました。CakePHPの慣例の1つは、すべてのテーブルに主キーがあり、それが最初の列であり、「id」と呼ばれることです。次の簡単なステートメントは、MySQL5.5の下で私のためにトリックを行いました:

ALTER TABLE `database_name`.`table_name` 
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (`id`);

これにより、既存のデータの前に整数型の新しい列「id」が追加されました(「FIRST」キーワード)。AUTO_INCREMENTキーワードは、1から始まるIDをインクリメントします。これで、すべてのデータセットに一意の数値IDが割り当てられます。(AUTO_INCREMENTステートメントがない場合、すべての行にid = 0が入力されます)。

于 2013-12-31T13:24:07.407 に答える
3

私はあなたのビジネスロジックを前提としたソリューションを提供しています。基本的に私の設計では、ユーザーとゲームの組み合わせに対してテーブルに1つのレコードのみを格納できるようにします。そこで、複合キーをテーブルに追加します。

PRIMARY KEY (`user_id`,`game_id`)
于 2013-03-06T20:39:24.723 に答える
2

自動インクリメントIDまたはUNIQUEIDを作成し、それを4つのフィールドで話している自然キーに追加します。これにより、テーブルのすべての行が一意になります...

于 2013-03-06T18:43:04.183 に答える
1

複数の一意キーをテーブルに設定

ALTER TABLE table_name
ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);
于 2018-06-01T07:16:02.347 に答える
0

MySQLの場合:

ALTER TABLE MyTable ADD MyId INT AUTO_INCREMENT PRIMARY KEY;
于 2019-07-15T20:12:22.590 に答える
0

yourColumnNameに一意ではない値がある場合は、一意のインデックスを追加します。これを試して:

CREATE UNIQUE INDEX [IDX_Name] ON yourTableName (yourColumnName) WHERE [id]>1963 --1963 is max(id)-1

ここで、いくつかの値を挿入してみてください。テスト用に存在します。

于 2021-04-23T02:53:11.977 に答える