How add unique key to existing table (with non uniques rows)
Asked Answered
L

9

90

I want to add complex unique key to existing table. Key contains from 4 fields (user_id, game_id, date, time). But table have non unique rows. I understand that I can remove all duplicate dates and after that add complex key.

Maybe exist another solution without searching all duplicate data. (like add unique ignore etc).

UPD I searched, how can remove duplicate mysql rows - i think it's good solution. Remove duplicates using only a MySQL query?

Lydell answered 6/3, 2013 at 18:36 Comment(1)
You can't have duplicates if you create a unique key.Marlomarlon
P
167

You can do as yAnTar advised

ALTER TABLE TABLE_NAME ADD Id INT AUTO_INCREMENT PRIMARY KEY

OR

You can add a constraint

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

But I think to not lose your existing data, you can add an indentity column and then make a composite key.

Publea answered 6/3, 2013 at 19:17 Comment(5)
what is an IDENTITY column ? I can find no reference of it in the doc except something related to AUTO_INCREMENT : dev.mysql.com/doc/refman/5.7/en/example-auto-increment.htmlUnsuspecting
As mentioned by @Unsuspecting the key word in MySQL is NOT IDENTITY but AUTO_INCREMENT. dev.mysql.com/doc/refman/5.7/en/example-auto-increment.htmlReply
For clarity the mysql syntax is: ALTER TABLE TABLE_NAME ADD Id INT AUTO_INCREMENT PRIMARY KEYBettis
The OP did not (explicitly) specify a particular database. IDENTITY is the correct syntax for MS/Oracle SQL-Server and perhaps other non MySQL/MariaDB dialects, for them use the AUTO_INCREMENT syntax .Cutback
The question is tagged with 'mysql', so the solution should apply to that DBMSLacrimator
R
34

The proper syntax would be - ALTER TABLE Table_Name ADD UNIQUE (column_name)

Example

ALTER TABLE  0_value_addition_setup ADD UNIQUE (`value_code`)
Rasia answered 4/10, 2016 at 10:19 Comment(3)
Although this code may help to solve the problem, it doesn't explain why and/or how it answers the question. Providing this additional context would significantly improve its long-term educational value. Please edit your answer to add explanation, including what limitations and assumptions apply.Rayburn
This marks the column unique if there are no duplicate entries. If there are some, it errors in Duplicate entry 'my_value' for key 'my_key' Molest
This is not 100 percent correct syntax as per MySQL web siteGeyer
B
12

I had to solve a similar problem. I inherited a large source table from MS Access with nearly 15000 records that did not have a primary key, which I had to normalize and make CakePHP compatible. One convention of CakePHP is that every table has a the primary key, that it is first column and that it is called 'id'. The following simple statement did the trick for me under MySQL 5.5:

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

This added a new column 'id' of type integer in front of the existing data ("FIRST" keyword). The AUTO_INCREMENT keyword increments the ids starting with 1. Now every dataset has a unique numerical id. (Without the AUTO_INCREMENT statement all rows are populated with id = 0).

Barty answered 31/12, 2013 at 13:24 Comment(0)
C
3

I am providing my solution with the assumption on your business logic. Basically in my design I will allow the table to store only one record for a user-game combination. So I will add a composite key to the table.

PRIMARY KEY (`user_id`,`game_id`)
Camphorate answered 6/3, 2013 at 20:39 Comment(0)
U
3

Set Multiple Unique key into table

ALTER TABLE table_name
ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);
Unexpressive answered 1/6, 2018 at 7:16 Comment(0)
E
2

Either create an auto-increment id or a UNIQUE id and add it to the natural key you are talking about with the 4 fields. this will make every row in the table unique...

Egger answered 6/3, 2013 at 18:43 Comment(0)
S
0

For MySQL:

ALTER TABLE MyTable ADD MyId INT AUTO_INCREMENT PRIMARY KEY;
Selfpity answered 15/7, 2019 at 20:12 Comment(0)
Y
0

If yourColumnName has some values doesn't unique, and now you wanna add an unique index for it. Try this:

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

Now, try to insert some values are exists for test.

Yama answered 23/4, 2021 at 2:53 Comment(0)
A
-1

ALTER TABLE table_name (field)

Amain answered 30/5 at 19:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.