搜尋

首頁  >  問答  >  主體

無論行如何,都是唯一的列

<p>無論列中的值是什麼,是否有辦法讓整行都是唯一的? </p> <p>所以,如果列<code>a</code> 中有<code>1</code>,列<code>b</code> 中有<code>2</code>b</code> 中有<code>2</code> ,那麼如果你將<code>2</code> 插入到列<code>a</code> 中,將<code>1</code> 插入到列<code>b</code>中,將會拋出錯誤。 </p> <pre class="brush:none;toolbar:false;"> --- --- | a | b | --- --- | 1 | 2 | | 2 | 1 | <- 由於上面已經存在,插入時會拋出錯誤 --- --- </pre></p>
P粉378264633P粉378264633456 天前489

全部回覆(2)我來回復

  • P粉146080556

    P粉1460805562023-09-04 12:21:14

    你可以使用觸發器來強制執行。但是我想不出一種好的方法來使用UNIQUE KEY約束來實現這一點。

    如果你改變儲存值的方式,讓它們位於單一欄位中,位於附加資料表的多行中,那麼使用UNIQUE KEY來強制唯一性將會更容易。


    如果你想表示相關的項目:

    CREATE TABLE item_group (
      group_id INT AUTO_INCREMENT PRIMARY KEY
    );
    
    CREATE TABLE item_group_members (
      group_id INT NOT NULL,
      member_id INT NOT NULL,
      PRIMARY KEY (group_id, member_id)
    );
    
    INSERT INTO item_group_members VALUES (1, 1), (1, 2);

    如果你需要每個成員只出現在一個群組中:

    ALTER TABLE item_group_members ADD UNIQUE KEY (member_id);

    回覆
    0
  • P粉186017651

    P粉1860176512023-09-04 11:25:21

    定義2個虛擬生成列,分別為最小值和最大值,並在它們上設定唯一限制:

    CREATE TABLE tablename (
      a INT NOT NULL, 
      b INT NOT NULL,
      x INT GENERATED ALWAYS AS (LEAST(a, b)),
      y INT GENERATED ALWAYS AS (GREATEST(a, b)),
      UNIQUE (x, y)
    );

    查看演示

    或者,對於MySql 8.0 :

    CREATE TABLE tablename (
      a INT NOT NULL, 
      b INT NOT NULL,
      UNIQUE ((LEAST(a, b)), (GREATEST(a, b))) -- 不要忘记括号 
    );

    查看演示

    回覆
    0
  • 取消回覆