ฉันจะระบุข้อ จำกัด เฉพาะสำหรับหลายคอลัมน์ใน MySQL ได้อย่างไร


865

ฉันมีโต๊ะ:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

ตอนนี้ฉันต้องการทำให้คอลัมน์ผู้ใช้อีเมลที่อยู่ไม่ซ้ำกัน (รวมกัน)

ฉันจะทำสิ่งนี้ใน MySql ได้อย่างไร

แน่นอนตัวอย่างเป็นเพียง ... ตัวอย่าง ดังนั้นโปรดอย่ากังวลเกี่ยวกับความหมาย

คำตอบ:


1436
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);

31
สิ่งนี้จะทำงานอย่างถูกต้องกับส่วนคำสั่ง ON DUPLICATE KEY ของคำสั่ง INSERT หรือไม่? นั่นคือถ้าฉันพยายามแทรกแถวที่ขัดแย้งกับค่าของผู้ใช้ / อีเมล / ที่อยู่แถวอื่น INSERT จะทำการกระทำที่ระบุโดยอนุประโยค ON DUPLICATE แทนหรือไม่
clizzin

6
การรวมกันของสามคนนี้จะไม่เหมือนใคร? หรือคอลัมน์สามคอลัมน์ทั้งหมดจะไม่ซ้ำกันหรือไม่
Gary Lindahl

95
สำหรับคนที่ใช้ MySQL workbench: ไปที่แท็บดัชนีและเลือก UNIQUE เป็นประเภทของคุณ ตั้งชื่อดัชนีของคุณและตรวจสอบคอลัมน์ที่เหมาะสมภายใต้ส่วน "คอลัมน์ดัชนี"
Pakman

10
เช่นเดียวกับฉันถ้าใครพบสิ่งนี้จากเครื่องมือค้นหา ... และเพื่อตอบคำถามของ Clizzin เกี่ยวกับว่าในการทำซ้ำคีย์จะทำงานร่วมกับคีย์คอมโพสิต - มันจะแน่นอน แต่มันจะต้องมีการปรับเล็กน้อยไวยากรณ์ ดูstackoverflow.com/questions/9537710/…
Joe

2
วิธีทำให้มันทำงานได้แม้จะมีค่า NULL ถ้าเราแทรกแถวเดียวกันสองกับค่า NULL นี้จะไม่ทำงาน ...
Wasim A.

237

ฉันมีตาราง MySQL:

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

และ UNIQUE KEY ใช้งานได้ตามที่คาดหวังจะช่วยให้แถว NULL หลายแถวของ id_box_elements และ id_router

ฉันใช้ MySQL 5.1.42 ดังนั้นอาจมีการอัพเดทบางอย่างเกี่ยวกับปัญหาที่กล่าวถึงข้างต้น โชคดีที่มันใช้งานได้และหวังว่ามันจะเป็นเช่นนั้น


34
ฉันต้องการทำเครื่องหมายคำตอบนี้ตามที่แสดงวิธีสร้างตารางใหม่ด้วยดัชนีที่ไม่ซ้ำกันซึ่งคำตอบของ jonstjohn ด้านบนบอกวิธีการอัปเดตตารางที่มีอยู่ พวกเขาทำสิ่งเดียวกันแม้ว่าจะขึ้นอยู่กับว่าคุณสร้างตารางใหม่หรืออัปเดตตารางที่มีอยู่ :)
GazB

3
สิ่งที่มี backquotes ทั้งหมดพวกเขาทำหน้าที่บางอย่าง?
puk

8
มันออกจาก Adminer (www.adminer.org) ซึ่งแทรก backquotes เหล่านี้โดยอัตโนมัติดังนั้นจึงไม่มีปัญหากับการชนคำสำคัญ mysql ที่ใช้เป็นชื่อคอลัมน์
Frodik

50

ดัชนีที่ไม่ซ้ำหลายคอลัมน์ไม่ทำงานใน MySQL หากคุณมีค่า NULL ในแถวเนื่องจาก MySQL ถือว่า NULL เป็นค่าที่ไม่ซ้ำกันและอย่างน้อยในปัจจุบันไม่มีเหตุผลที่จะต้องแก้ไขในดัชนีหลายคอลัมน์ ใช่พฤติกรรมนั้นบ้าเพราะมัน จำกัด แอพพลิเคชั่นที่ถูกต้องของดัชนีหลายคอลัมน์ แต่มันคือสิ่งที่มันเป็น ... ณ ตอนนี้มันเป็นข้อผิดพลาดที่ได้รับการประทับตราด้วย "จะไม่แก้ไข" บน MySQL ข้อผิดพลาดติดตาม ...


11
สองประเด็นของการชี้แจง: 1) พฤติกรรมนี้ไม่ได้มีไว้สำหรับENGINE BDBและ 2) สิ่งนี้เป็นพฤติกรรมที่มีการบันทึกไว้แม้ว่า IMHO จะไม่ได้รับการบันทึกอย่างเปิดเผยมากพอ ดูข้อผิดพลาด MySQL 25544 bugs.mysql.com/bug.php?id=25544สำหรับการสนทนา
pilcrow

2
ขอบคุณสำหรับ NULL หัวขึ้นปัญหาที่ฉันมี ... ฉันคิดว่าฉันจะไปกับการตรวจสอบกัญชา
Daniel Doezema

7
นี่ไม่ใช่คำตอบ ควรแสดงความคิดเห็นกับคำถามเดิม
การชดเชย จำกัด

เอกสารทางการบอกว่า: โปรดทราบว่าในฐานะของ MySQL 5.1, BDB ไม่ได้รับการสนับสนุนอีกต่อไป
George D.

2
ข้อมูลที่ดีมาก แต่ไม่ใช่คำตอบ เกี่ยวข้องเฉพาะกับอุปกรณ์ต่อพ่วงคำถาม
billynoah

23

คุณเคยลองสิ่งนี้หรือไม่?

UNIQUE KEY `thekey` (`user`,`email`,`address`)

สิ่งที่เอริคกล่าวว่าผลงานได้ดีสำหรับฉัน: UNIQUE KEY thekey` ( user, email, address) ` ฉันใช้ MYSQL เวอร์ชั่น 5.5.24 คุณสามารถตั้งค่านี้ได้แม้กระทั่งใน PHPMYADMIN หากคุณใช้งานอยู่ ฉันใช้ PMA เวอร์ชัน 3.5.1
WQC

พยายามกับ MySql 5.6 ทำงานได้ตั้งแต่ครั้งแรก ขอบคุณ Erick!
Lawrence

11

สิ่งนี้ใช้ได้กับ mysql เวอร์ชั่น 5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);

1
ดูเหมือนว่าจะทำงานโดยไม่มีเครื่องหมายคำพูดเดี่ยวบนชื่อคอลัมน์
Pratik Singhal

7

MySql 5 หรือสูงกว่ามีพฤติกรรมเช่นนี้ (ฉันเพิ่งทดสอบ):

  • คุณสามารถกำหนดข้อ จำกัด ที่ไม่ซ้ำที่เกี่ยวข้องกับคอลัมน์ nullable สมมติว่าคุณกำหนดข้อ จำกัด ที่ไม่ซ้ำกัน (A, B) โดยที่ A ไม่เป็นโมฆะ แต่ B คือ
  • เมื่อประเมินข้อ จำกัด ดังกล่าวคุณสามารถมี (A, null) ได้หลายครั้งที่คุณต้องการ (ค่า A เดียวกัน!)
  • คุณสามารถมีได้หนึ่งคู่ (A, ไม่ใช่ null B)

ตัวอย่าง: PRODUCT_NAME, PRODUCT_VERSION 'แก้ว', null 'แก้ว', null 'ไวน์', 1

ตอนนี้หากคุณพยายามแทรก ('ไวน์' 1) อีกครั้งจะรายงานการละเมิดข้อ จำกัด หวังว่านี่จะช่วยได้


ขอบคุณที่อธิบาย ฉันมีเอกลักษณ์ (A, B, C) และฉันไม่รู้ว่าทำไมจึงอนุญาตให้ใช้ชุดค่าผสมของ null พร้อมตัวเลือกที่ไม่เป็นค่าเดียวกัน
Alexandru Topală

6

คุณสามารถเพิ่มหลายคอลัมน์ดัชนีที่ไม่ซ้ำกันผ่านทางphpMyAdmin (ฉันทดสอบในรุ่น 4.0.4)

นำทางไปยังหน้าโครงสร้างสำหรับตารางเป้าหมายของคุณ เพิ่มดัชนีที่ไม่ซ้ำในคอลัมน์ใดคอลัมน์หนึ่ง ขยายรายการดัชนีที่ด้านล่างของหน้าโครงสร้างเพื่อดูดัชนีเฉพาะที่คุณเพิ่งเพิ่ม คลิกที่ไอคอนแก้ไขและในกล่องโต้ตอบต่อไปนี้คุณสามารถเพิ่มคอลัมน์เพิ่มเติมลงในดัชนีเฉพาะนั้น


3

ฉันทำแบบนี้:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

การประชุมของฉันสำหรับการที่ไม่ซ้ำกันมีindex_nameTableName_Column1_Column2_Column3_uindex


2

สำหรับการเพิ่มดัชนีเฉพาะต่อไปนี้จำเป็นต้องใช้:

1) table_name
2) index_name
3) คอลัมน์ที่คุณต้องการเพิ่มดัชนี

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

ในกรณีของคุณเราสามารถสร้างดัชนีที่ไม่ซ้ำกันดังนี้:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);

1

หากคุณต้องการหลีกเลี่ยงการซ้ำซ้อนในอนาคต สร้างอีกคอลัมน์หนึ่งว่า id2

UPDATE tablename SET id2 = id;

ตอนนี้เพิ่มที่ไม่ซ้ำกันในสองคอลัมน์:

alter table tablename add unique index(columnname, id2);

1

หากคุณกำลังสร้างตารางใน mysql ให้ใช้ดังต่อไปนี้:

create table package_template_mapping (
mapping_id  int(10) not null auto_increment  ,
template_id int(10) NOT NULL ,
package_id  int(10) NOT NULL ,
remark      varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);

0

ก่อนอื่นให้กำจัดรายการที่มีอยู่เดิม

delete a from votes as a, votes as b where a.id < b.id 
and a.user <=> b.user and a.email <=> b.email 
and a.address <=> b.address;

จากนั้นเพิ่มข้อ จำกัด ที่ไม่ซ้ำใคร

ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);

ตรวจสอบข้อ จำกัด ด้วย

SHOW CREATE TABLE votes;

โปรดทราบว่าผู้ใช้อีเมลที่อยู่จะได้รับการพิจารณาว่าไม่ซ้ำกันหากมีผู้ใดมีค่าเป็นศูนย์


0

สำหรับ PostgreSQL ... มันใช้ไม่ได้กับดัชนี มันทำให้ฉันมีข้อผิดพลาดดังนั้นฉันทำสิ่งนี้:

alter table table_name
add unique(column_name_1,column_name_2);

PostgreSQL ให้ดัชนีที่ไม่ซ้ำกับชื่อของตัวเอง ฉันเดาคุณสามารถเปลี่ยนชื่อของดัชนีในตัวเลือกสำหรับตารางหากจำเป็นต้องเปลี่ยน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.