一意性制約[MySQL][データベース]

一意の制約(UNIQUE)

一意の制約の役割:

フィールドを制限するために使用される値を繰り返すことはできません(ただし、複数のnullが存在する可能性があります)

固有の制約の機能:

  1. 同じテーブルに複数の一意の制約を含めることができます
  2. 一意の制約は、列の値が一意であるか、複数の列の組み合わせの値が一意である可能性があります
    • つまり、一意の制約をテーブルレベルの制約として宣言できます(テーブルレベルの制約として宣言することも、複合制約として宣言することもできます)
  3. 一意性制約により、列の値をnullにすることができます
    • 一意の制約を持つフィールドの複数の値はnullにすることができます
  4. 一意性制約を作成するときに、一意性制約に名前が付けられていない場合、一意性契約名はデフォルトで列名と同じになります
  5. MySQLは、デフォルトで一意性制約を使用して列に一意性インデックスを作成します。作成される一意性インデックス名は、対応する一意性制約名と同じです。

一意の制約を追加するにはどうすればよいですか?

ここでは、2つの方法で一意の制約を追加します

方法1:CREATETABLE中に一意のインデックスを追加する

以下では、例を使用して、CREATETABLEに一意の制約を追加する方法を示します。

CREATE TABLE test2(
# 这里就是声明了一个列级约束,也就是我们的唯一性约束
id INT UNIQUE,
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2)
);
  • 注:テーブルを作成するときに列レベルの制約を宣言する場合、CONSTRAINTキーワードを使用して制約に名前を付けることはできません。
  • これは、test2テーブルのidフィールドに追加された一意性制約です(ここでは列レベルの制約として宣言されています)
CREATE TABLE test3(
id INT UNIQUE,
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2),
#这里就是声明了一个表级约束
[CONSTRAINT uk_test2_email] UNIQUE(email)
);
  • 上記の[]の内容は省略でき、[]の内容は実際には一意の制約の名前です
  • ここでの制約uk_test2_emailは、実際にはこの一意の制約の名前です:uk_test2_email
  • 一意性制約を追加するときに一意性制約に名前を付けない場合、デフォルトはフィールド名(列名)と同じです。

テーブルを作成して一意の制約を追加した後、この時点で、テーブルのデータで、一意の制約が追加されたフィールドの値を繰り返すことはできませんが、複数の値を繰り返すことができます同時にNULLになる可能性があります。また、複数のnullが同じではないことも示しています。

INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'tom','[email protected]',4800);
  • テーブル作成後、初めてデータを追加しますが、今回は実行に問題はありません。
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'tom','[email protected]'4600);
  • 現時点では、test2テーブルのidフィールドに一意の制約を追加しているため、追加は失敗します。現時点では、test2テーブルのデータのidフィールドの値を繰り返すことはできません。現時点では、このレコードを追加するときに判断します。テーブルにはすでにID1のレコードがあります。現時点では、追加するレコードのIDを1にすることはできないため、この時点でエラーが発生します。
INSERT INTO test2(id,last_name,email,salary)
VALUES(2,'tom1',NULL,4600),
(s,'tom2',NULL,4600);
  • この時点で、追加は成功しています。つまり、一意性制約(UNIQUE)を追加するフィールドにnull値を追加でき、null値を複数回追加できます。ここにメールを送信します。テーブル内で一意であると宣言されたフィールドが1回あります。null値を持つ2つのレコードを追加します。今回は、実行にエラーはありません。

一意の制約の場合、列レベルの制約として宣言するだけでなく、テーブルレベルの制約として宣言することもできます。フィールド)

では、一意の制約を複合として宣言するにはどうすればよいでしょうか。

CREATE TABLE USER(
id INT
'name' VARCHAR(15),
'password' VARCHAR(25),

#表级约束(这个时候我们将这个表级约束声明为复合约束)
CONSTRAINT uk_user_name_pwd UNIQUE('name','password'),
);
  • ここでは、テーブルレベルの制約を宣言し、それを適合制約として宣言していますが、なぜ複合制約と呼ばれるのですか?
    • 同じ制約で一度に2つのフィールド(名前とパスワード)を制約するのは今回のはずです

注:一意性制約が適合として宣言されている場合、複合一意性制約のこれらのフィールドの値が同じである場合にのみ繰り返されます

例えば:

INSERT INTO USER
VALUES(1,'tom','abc'),
(1,'tom1','abc');
  • 名前フィールドとパスワードフィールドに複合一意制約を追加したことがわかっています。今回は、名前フィールドとパスワードフィールドの値が同じである場合、繰り返しはありません。ここでは、パスワードの値のみが繰り返されます。名前の名前の場合値は繰り返されませんが、今回は正常に追加されます

方法2:ALTERTABLE中に一意性制約を追加する

ケース2では、一意の制約を追加する方法がさらに2つあります。

方法1:追加
ALTER TABLE test2
ADD [CONSTRAINT uk_test2_sal] UNIQUE(salary);
  • このaddメソッドに一意性制約を追加することは、CREATETABLEに追加するときにテーブルレベルの制約を追加することに似ています。

方法2:変更

ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;

  • 一意の制約を追加するこのMODIFYメソッドは、CREATETABLEで列レベルの制約を追加したときの列レベルの制約を追加する形式に似ています。

では、どうすれば一意性の制約を取り除くことができますか?

一意の制約を削除する前に、次のことを知っておく必要があります。

  1. 一意の制約を追加するフィールドは、一意のインデックスも自動的に作成します
  2. 一意性制約の削除は、一意性インデックスを削除することによってのみ削除できます
  3. 一意のインデックスを削除する場合は、一意のインデックス名を指定します。一意のインデックス名は、一意の制約名と同じです。
  4. 一意性制約を作成するときに制約名が指定されていない場合、それが単一列制約である場合、デフォルトは列名と同じであり、複合制約である場合、デフォルトは列名と同じです。結合された列の最初の列の

次に、一意のインデックス(DROP INDEX)を削除する方法の例を示します。

注:一意のインデックスが削除されると、対応する一意の制約が自動的に削除されます

ALTER TABLE test2
DROP INDEX last_name;

  • test2テーブルのlast_nameフィールドに一意性制約を追加する場合、CREATE TABLE中に列レベルの制約として追加します。一意性インデックスを追加する場合、制約名を指定できないため、一意性制約名はデフォルトでlast_name列名が同じである場合、一意のインデックス名が一意の制約名と同じである場合、両方ともlast_nameです。
ALTER TABLE test2
DROP TABLE uk_test2_sal;

  • ここで、test2テーブルのsalaryフィールドに一意の制約を追加する場合、CREATE TABLE中にテーブルレベルの制約として追加します。この一意の制約を追加する場合、この一意の制約の名前を指定します。uk_test2_sal、次に現時点での一意のインデックス名は、uk_test2_salです。

おすすめ

転載: blog.csdn.net/m0_57001006/article/details/123564449