Mysql

在mysql中,當列中有空值時,如何向表中添加主鍵和復合鍵以禁止重複行?

  • October 16, 2020

在下表(8 mi 行)中,每一列都有 Null 值。但是,永遠不可能有兩行相同的行(每行總是至少有一列具有不同的值)。

如何更改此表,使其具有強制不存在重複行的複合鍵?此外,下表沒有主鍵。如何向它添加主鍵?

在此處輸入圖像描述

可能的解決方案:在表結構中添加一個生成並連接整行的列,然後將此列定義為唯一的。

當然,如果你直接意識到這一點,那麼這個索引將比表體本身大,它會大大降低處理速度。為了避免這種情況,選擇一些雜湊函式,它提供足夠小的衝突機率,並將其應用於連接的行內容。對於 NULLable 列,添加一個取決於列值為 null 的字節,並將列的 NULL 替換為某個常量值。

例如,對於表

CREATE TABLE test ( i_column INT, 
                   t_column DATETIME,
                   s_column TEXT );

這可能是

ALTER TABLE test
ADD COLUMN check_uniqueness BINARY(128)
          GENERATED ALWAYS AS (SHA2(
                                    CONCAT(
                                           i_column IS NULL,
                                           COALESCE(i_column, 0),
                                           t_column IS NULL,
                                           COALESCE(t_column, '2000-01-01'),
                                           s_column IS NULL,
                                           COALESCE(s_column, '')
                                          ), 
                                    512
                                   )
                              ) VIRTUAL,
ADD UNIQUE INDEX checking_uniqueness (check_uniqueness);

展示小提琴

引用自:https://dba.stackexchange.com/questions/278215