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://127.0.0.1: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!
广告