sql >> Database >  >> RDS >> Mysql

MySQL-fout #1071 - Opgegeven sleutel was te lang; maximale sleutellengte is 767 bytes

767 bytes in MySQL versie 5.6 (en eerdere versies), is de vermelde prefixbeperking voor InnoDB-tabellen. Het is 1.000 bytes lang voor MyISAM-tabellen. Deze limiet is verhoogd tot 3072 bytes in MySQL-versie 5.7 (en hoger).

Je moet er ook rekening mee houden dat als je een index instelt op een big char of varchar veld dat utf8mb4 . is gecodeerd, moet u de maximale lengte van het indexvoorvoegsel van 767 bytes (of 3072 bytes) delen door 4, wat resulteert in 191 . Dit komt omdat de maximale lengte van een utf8mb4 karakter is vier bytes. Voor een utf8 karakter zou het drie bytes zijn, wat resulteert in een maximale lengte van het indexvoorvoegsel van 255 (of minus null-terminator, 254 tekens).

Een optie die je hebt is om gewoon een ondergrens te plaatsen op je VARCHAR velden.

Een andere optie (volgens de antwoord op dit probleem ) is om de subset van de kolom te krijgen in plaats van het volledige bedrag, d.w.z.:

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

Tweak als je de sleutel nodig hebt om toe te passen, maar ik vraag me af of het de moeite waard zou zijn om je datamodel met betrekking tot deze entiteit te herzien om te zien of er verbeteringen mogelijk zijn, waardoor je de beoogde bedrijfsregels kunt implementeren zonder de MySQL-beperking te raken .



  1. Nde max salaris in Oracle

  2. Een gegevensmodel om uw kostbaarste bezit bij te houden

  3. opgeslagen procedures met sqlAlchemy

  4. Waarom lijk ik Oracle 11g niet te dwingen meer CPU's te verbruiken voor een enkele SQL-query?