sql >> Databáze >  >> RDS >> Mysql

Použijte více sloupců jako jedinečný identifikátor pro mysql

Ano, MySQL tuto možnost poskytuje.

ALTER TABLE MyTable
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`)

Nevím, k čemu tuto tabulku používáte, ale zdá se, že tento jedinečný klíč může být silným kandidátem na primární klíč tabulky. Primární klíč je automaticky také jedinečný klíč. Pokud se rozhodnete z něj udělat primární klíč, proveďte místo toho následující:

ALTER TABLE MyTable
ADD PRIMARY KEY (`group_id`, `user_id`)

(Pokud se zobrazí chybová zpráva, že již existuje primární klíč, zadejte ALTER TABLE MyTable DROP PRIMARY KEY a poté opakujte výše uvedený příkaz.)

Upravit: V reakci na komentář uživatele

Nemůžete mít více řádků s identickými jinými než NULL hodnoty pro sloupce pokryté jedinečným klíčem. Nemůžete tedy mít dva řádky, kde group_id = 0 AND user_id = 5 , například. 0 je hodnota. Pokud však u jednoho nebo obou sloupců nastavíte hodnotu null, můžete mít více řádků, které jsou identické až do umístění NULL s. Můžete tedy mít dva (nebo více) řádky, kde group_id IS NULL AND user_id = 1234 .

Výhrada:Výše ​​uvedené platí pro oba běžně používané úložiště MySQL (MyISAM a InnoDB). MySQL má úložné stroje, ve kterých je NULL je považováno za jedinečnou hodnotu, ale pravděpodobně je nepoužíváte.

Pokud u jednoho nebo obou sloupců nastavíte hodnotu Null, pak váš jedinečný klíč nemůže být primárním klíčem – primární klíč musí být ve sloupcích, které NOT NULL .

Předpokládejme, že jste z tohoto klíče udělali primární klíč a nyní chcete povolit NULL v group_id sloupec. Nevím, jaký datový typ group_id je v tuto chvíli; Předpokládám, že je aktuálně INT UNSIGNED NOT NULL , ale pokud to není toto, budete muset upravit níže uvedené. Tento klíč byste již nemohli používat jako primární klíč. Zde je příkaz, který můžete spustit, abyste provedli požadované změny:

ALTER TABLE MyTable
    DROP PRIMARY KEY,
    MODIFY group_id INT UNSIGNED,
    ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`)


  1. Uzamčení databáze MySQL tak, aby dotaz mohla spustit pouze jedna osoba?

  2. Seznamte se s Michalem Barem a mnou na Microsoft Ignite!

  3. Může MySQL Nested Select vrátit seznam výsledků

  4. Výchozí hodnota MySQL jako hodnota jiného pole