MySQL - 唯一鍵



MySQL 中的**唯一鍵**,當應用於資料庫表中的某個欄位時,不允許在該列中插入重複值,即它用於唯一標識表中的記錄。

通常,任何關係資料庫都包含儲存在多個表中的大量資訊,並且每個表都儲存大量記錄。當我們處理如此大量的資料時,存在冗餘(重複記錄)的可能性。SQL 鍵是處理此問題的一種方法。

此唯一鍵作為主鍵約束的替代方案;因為唯一鍵和主鍵都確保資料庫表中列的唯一性。

建立 MySQL 唯一鍵

我們可以使用 UNIQUE 關鍵字在 MySQL 表列上建立唯一鍵,它具有以下特性:

  • 即使唯一鍵類似於表中的主鍵,它也可以接受單個 NULL 值,而主鍵則不能。
  • 它不能具有重複值。
  • 它也可以用作另一個表中的外部索引鍵。
  • 一個表可以有多個唯一列。

語法

以下是建立表列上唯一鍵約束的語法:

CREATE TABLE table_name(
   column_name1 datatype UNIQUE, 
   column_name2 datatype,
   ...
);

如您所見,在使用 CREATE TABLE 語句建立表時,我們只需要在所需列的名稱後指定關鍵字**UNIQUE**。

示例

在此示例中,讓我們建立一個名為**CUSTOMERS**的表,並在其一個欄位 ADDRESS 上定義一個唯一鍵。請檢視以下查詢:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25) UNIQUE,
   SALARY DECIMAL (18, 2)
);

輸出

顯示的表結構將包含 ADDRESS 列上的 UNI 索引,如下所示:

欄位 型別 Null 預設值 額外
ID int NO NULL
NAME varchar(20) NO NULL
AGE int NO NULL
ADDRESS char(25) YES UNI NULL
SALARY decimal(18, 2) YES NULL

如您在表定義中看到的,唯一鍵是在 ADDRESS 欄位上建立的。

建立多個唯一鍵

我們可以在單個 MySQL 表中的列上建立一個或多個唯一鍵約束。當此約束應用於多個欄位時,不能在這些欄位中插入重複值。

語法

以下是建立表中多個列上的唯一鍵約束的語法:

CREATE TABLE table_name(column_name1 UNIQUE, column_name2 UNIQUE,...)

示例

假設我們已使用 CREATE TABLE 語句在 MySQL 資料庫中建立了另一個名為 CUSTOMERS 的表。

這裡我們使用 UNIQUE 關鍵字在 NAME 和 ADDRESS 列上建立唯一約束,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL UNIQUE,
   AGE INT NOT NULL,
   ADDRESS CHAR (25) UNIQUE,
   SALARY DECIMAL (18, 2)
);

輸出

顯示的表結構將包含 ADDRESS 列上的 UNI 索引,如下所示:

欄位 型別 Null 預設值 額外
ID int NO NULL
NAME varchar(20) NO UNI NULL
AGE int NO NULL
ADDRESS char(25) YES UNI NULL
SALARY decimal(18, 2) YES NULL

在現有列上建立唯一鍵

我們可以使用 ALTER TABLE... ADD CONSTRAINT 語句在表的現有列上新增唯一鍵約束。

語法

以下是建立表中現有列上唯一鍵的語法:

ALTER TABLE table_name 
ADD CONSTRAINT unique_key_name 
UNIQUE (column_name);

注意 - 這裡的 UNIQUE_KEY_NAME 只是唯一鍵的名稱。建立唯一鍵時,指定名稱是可選的。它用於從表的列中刪除約束。

示例

使用 ALTER TABLE 語句,您可以在先前建立的 CUSTOMERS 表中的任何現有列上新增唯一約束。在以下示例中,我們正在將唯一約束應用於 NAME 列,如下所示:

ALTER TABLE CUSTOMERS 
ADD CONSTRAINT UNIQUE_NAME 
UNIQUE (NAME);

輸出

顯示的表結構將包含 ADDRESS 列上的 UNI 索引,如下所示:

欄位 型別 Null 預設值 額外
ID int NO NULL
NAME varchar(20) NO UNI NULL
AGE int NO NULL
ADDRESS char(25) YES NULL
SALARY decimal(18, 2) YES NULL

刪除 MySQL 唯一鍵

如果列上已經存在唯一約束,則可以在不需要時刪除它。要從表的列中刪除唯一約束,您需要再次使用 ALTER TABLE 語句。

語法

以下是刪除表列中唯一約束的 SQL 查詢:

ALTER TABLE TABLE_NAME DROP CONSTRAINT UNIQUE_KEY_NAME;

示例

在此示例中,我們將使用以下 MySQL 查詢從 CUSTOMERS 表的 NAME 列中刪除名為 UNIQUE_NAME 的約束:

ALTER TABLE CUSTOMERS DROP CONSTRAINT UNIQUE_NAME;

輸出

顯示的表結構將僅在 ADDRESS 列上包含 UNI 索引,表明 NAME 列上的索引已刪除。

欄位 型別 Null 預設值 額外
ID int NO NULL
NAME varchar(20) NO NULL
AGE int NO NULL
ADDRESS char(25) YES NULL
SALARY decimal(18, 2) YES NULL

使用客戶端程式建立唯一鍵

除了使用列上的鍵透過 MySQL 查詢唯一標識外,我們還可以使用客戶端程式在欄位上應用唯一鍵約束。

語法

要在 PHP 程式中對錶欄位應用唯一鍵,我們需要使用**mysqli**函式**query()**執行帶有 UNIQUE 關鍵字的 CREATE TABLE 語句,如下所示:

$sql = 'CREATE TABLE customers(cust_ID INT NOT NULL UNIQUE, cust_Name VARCHAR(30))';
$mysqli->query($sql);

要在 JavaScript 程式中對錶欄位應用唯一鍵,我們需要使用**mysql2**庫的**query()**函式執行帶有 UNIQUE 關鍵字的 CREATE TABLE 語句,如下所示:

sql = "CREATE TABLE customers(cust_ID INT NOT NULL, cust_Name VARCHAR(30), cust_login_ID INT AUTO_INCREMENT, PRIMARY KEY(cust_login_ID))";
con.query(sql);  

要在 Java 程式中對錶欄位應用唯一鍵,我們需要使用**JDBC**函式**execute()**執行帶有 UNIQUE 關鍵字的 CREATE TABLE 語句,如下所示:

String sql = "CREATE TABLE customers(Cust_ID INT NOT NULL UNIQUE, Cust_Name VARCHAR(30))";
statement.execute(sql);

要在 python 程式中對錶欄位應用唯一鍵,我們需要使用**MySQL Connector/Python**的**execute()**函式執行帶有 UNIQUE 關鍵字的 CREATE TABLE 語句,如下所示:

unique_key_query = 'CREATE TABLE TEST1 (ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, MOBILE BIGINT UNIQUE, AADHAR BIGINT UNIQUE, AGE INT NOT NULL)'
cursorObj.execute(unique_key_query)

示例

以下是程式:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } // printf('Connected successfully.
'); $sql = 'CREATE TABLE customers(cust_ID INT NOT NULL UNIQUE, cust_Name VARCHAR(30))'; if ($mysqli->query($sql)) { echo "Unique column created successfully in customers table \n"; } if ($mysqli->errno) { printf("Table could not be created!.
", $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下:

Unique column created successfully in customers table   
var mysql = require("mysql2");
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
}); //Connecting to MySQL

con.connect(function (err) {
  if (err) throw err;
  console.log("Connected successfully...!");
  console.log("--------------------------");
  sql = "USE TUTORIALS";
  con.query(sql);

  //create a table that stores primary key!
  sql = "CREATE TABLE customers(cust_ID INT NOT NULL, cust_Name VARCHAR(30), cust_login_ID INT AUTO_INCREMENT, PRIMARY KEY(cust_login_ID))";
  con.query(sql);
  
  //describe table details
  sql = "DESCRIBE TABLE customers";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});    

輸出

生成的輸出如下:

[
    {
      id: 1,
      select_type: 'SIMPLE',
      table: 'customers',
      partitions: null,
      type: 'ALL',
      possible_keys: null,
      key: null,
      key_len: null,
      ref: null,
      rows: 1,
      filtered: 100,
      Extra: null
    }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class UniqueKey {
   public static void main(String[] args) {
      String url = "jdbc:mysql://:3306/TUTORIALS";
      String username = "root";
      String password = "password";
      try {
         Class.forName("com.mysql.cj.jdbc.Driver");
         Connection connection = DriverManager.getConnection(url, username, password);
         Statement statement = connection.createStatement();
         System.out.println("Connected successfully...!");

         //Create a unique key in the customer table...!;
         String sql = "CREATE TABLE customers(Cust_ID INT NOT NULL UNIQUE, Cust_Name VARCHAR(30))";
         statement.execute(sql);
         System.out.println("Unique key created successfully...!");
         ResultSet resultSet = statement.executeQuery("DESCRIBE customers");
         while (resultSet.next()){
            System.out.println(resultSet.getString(1)+" "+resultSet.getString(2)+" "
                    +resultSet.getString(3)+ " "+ resultSet.getString(4));
         }
         connection.close();
      } catch (Exception e) {
         System.out.println(e);
      }
   }
}   

輸出

獲得的輸出如下所示:

Connected successfully...!
Unique key created successfully...!
Cust_ID int NO PRI null
Cust_Name varchar(30) YES  null
import mysql.connector
#establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
cursorObj = connection.cursor()
# Create table 
unique_key_query = 'CREATE TABLE TEST1 (ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, MOBILE BIGINT UNIQUE, AADHAR BIGINT UNIQUE, AGE INT NOT NULL)'
cursorObj.execute(unique_key_query)
connection.commit()
print("Unique key column is created successfully!")
cursorObj.close()
connection.close()   

輸出

以下是上述程式碼的輸出:

Unique key column is created successfully!
廣告