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!

