MySQL - Unique 唯一键
MySQL 中的唯一键应用于数据库表的某个字段时,不允许在该列中插入重复的值,即,它用于唯一地标识表中的一条记录。
通常,任何关系数据库都包含存储在多个表中的大量信息,并且每个表都包含大量记录。当我们处理如此海量的数据时,可能会出现冗余(重复记录)。SQL 键是处理此问题的一种方法。
此唯一键可替代主键约束;因为唯一键和主键都确保数据库表中某一列的唯一性。
创建 MySQL 唯一键
我们可以使用 UNIQUE 关键字在 MySQL 表列上创建唯一键,它具有以下特性 -
- 尽管唯一键与表中的主键类似,但与主键不同,它可以接受单个 NULL 值。
- 它不能有重复的值。
- 它也可以用作另一个表的外键。
- 一个表可以有多个唯一列。
语法
以下是在表中的列上创建 UNIQUE 键约束的语法 -
CREATE TABLE table_name( column_name1 datatype UNIQUE, column_name2 datatype, ... );
正如您所见,在使用 CREATE TABLE 语句创建表时,我们只需在所需列的名称后指定关键字 UNIQUE 即可。
示例
在此示例中,我们将创建一个名为 CUSTOMERS 的表,并在其字段 ADDRESS 上定义一个 UNIQUE 键。请看以下查询 -
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 索引,如下所示 -
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
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 列上创建 UNIQUE 约束,如下所示 -
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 索引,如下所示 -
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
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 表中任何现有列上添加 UNIQUE 约束。在下面的示例中,我们将在 NAME 列上应用 UNIQUE 约束,如下所示 -
ALTER TABLE CUSTOMERS ADD CONSTRAINT UNIQUE_NAME UNIQUE (NAME);
输出
显示的表结构将包含 ADDRESS 列上的 UNI 索引,如下所示 -
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
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 语句。
语法
以下是从表的列中删除 UNIQUE 约束的 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 列上的索引已被删除。
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
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 "; } 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", }); //连接到 MySQL con.connect(function (err) { if (err) throw err; console.log("Connected successfully...!"); console.log("--------------------------"); sql = "USE TUTORIALS"; con.query(sql); //创建一个存储主键的表! 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); //描述表详细信息 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://localhost: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 #建立连接 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!