MySQL - 主键



主键 (PRIMARY KEY) 是应用于 MySQL 表字段的约束。应用此约束后,该表列中的值将被唯一标识。它是任何表最合适的候选键,可以作为主键。

一个表只能有一个主键,它可以由单个或多个字段组成。当多个字段用作主键时,它们被称为组合键。

您可以在创建新表时创建主键,也可以将其应用于数据库中已存在的表。但是,如果将其应用于现有表,则必须确保表中不存在主键,并且。

创建 MySQL 主键

要在新的 MySQL 表上创建主键,必须在使用 CREATE TABLE 语句创建新表时将该列指定为主键。

在表上创建主键时,请记住以下几点:

  • 主键列必须只包含唯一值。
  • 它不能保存 NULL 值。
  • 一张表只能有一个主键。
  • 主键长度不能超过 900 字节。

语法

以下是将表的列定义为主键的语法:

CREATE TABLE table_name( column_name NOT NULL PRIMARY KEY(column_name) );

示例

在以下示例中,让我们使用 CREATE TABLE 查询在 MySQL 数据库中创建一个名为 CUSTOMERS 的表。在此查询中,我们将在名为 ID 的列上添加 PRIMARY KEY 约束。

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

输出

显示的表结构将包含 ADDRESS 列上的 UNI 索引,如下所示:

字段 类型 空值 默认值 额外
ID int PRI NULL
NAME varchar(20) NULL
AGE int NULL
ADDRESS char(25) NULL
SALARY decimal(18, 2) NULL

验证

为了进一步验证 PRIMARY KEY 约束是否应用于 ID 列,让我们使用以下查询将不同类型的值插入 CUSTOMERS 表:

Open Compiler
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 23, 'Pune', 2000.00), (1, 'John', 25, 'Hyderabad', 3000.00);

显示以下错误:

ERROR 1062 (23000): Duplicate entry '1' for key 'customers.PRIMARY'

如上所示,您不能将重复值和空值插入此主键列。

在现有列上创建主键

如果在创建新表时未创建主键(任何原因),我们也可以在表的现有列上添加主键。但是,仅当表中不存在主键(因为 MySQL 表不能包含多个主键)并且应用它的列只包含唯一值时,才能在现有表上添加主键。

您可以使用 ALTER TABLE... ADD CONSTRAINT 语句在现有表上添加主键。

语法

以下是创建表现有列上唯一约束的语法:

ALTER TABLE table_name ADD CONSTRAINT PRIMARY KEY (column_name);

示例

使用 ALTER TABLE 语句,您可以在前面创建的 CUSTOMERS 表的现有列上添加 PRIMARY KEY。在以下示例中,我们正在将 PRIMARY KEY 应用于 ID 列,如下所示:

ALTER TABLE CUSTOMERS ADD CONSTRAINT PRIMARY KEY (ADDRESS);

输出

显示的表结构将包含 ADDRESS 列上的 UNI 索引,如下所示:

字段 类型 空值 默认值 额外
ID int PRI NULL
NAME varchar(20) NULL
AGE int NULL
ADDRESS char(25) NULL
SALARY decimal(18, 2) NULL

但是,如果添加 PRIMARY KEY 的列包含重复值或空值,则无法将其设置为主键。

Learn MySQL in-depth with real-world projects through our MySQL certification course. Enroll and become a certified expert to boost your career.

删除 MySQL 主键

MySQL 提供 ALTER TABLE... DROP 语句来从表中删除主键。

语法

以下是使用 ALTER TABLE... DROP 语句删除 PRIMARY KEY 约束的语法:

ALTER TABLE table_name DROP PRIMARY KEY;

示例

让我们考虑一下在名为 ID 的列上存在主键约束的 CUSTOMERS 表。您可以通过执行以下语句从 ID 列中删除此约束

ALTER TABLE CUSTOMERS DROP PRIMARY KEY;

输出

显示的表结构将包含 ADDRESS 列上的 UNI 索引,如下所示:

字段 类型 空值 默认值 额外
ID int NULL
NAME varchar(20) NULL
AGE int NULL
ADDRESS char(25) NULL
SALARY decimal(18, 2) NULL

使用客户端程序创建主键

我们也可以使用客户端程序在表字段上应用主键。

语法

要在PHP程序中为字段应用主键,我们需要使用mysqli函数query()执行包含PRIMARY KEY关键字的CREATE查询,如下所示:

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

要在JavaScript程序中为字段应用主键,我们需要使用mysql2库的query()函数执行包含PRIMARY KEY关键字的CREATE查询,如下所示:

sql = `CREATE TABLE customers(cust_ID INT NOT NULL primary key, cust_Name VARCHAR(30))`; con.query(sql);

要在Java程序中为字段应用主键,我们需要使用JDBC函数execute()执行包含PRIMARY KEY关键字的CREATE查询,如下所示:

String sql = "CREATE TABLE customers(cust_ID INT NOT NULL UNIQUE, cust_Name VARCHAR(30), cust_login_ID INT AUTO_INCREMENT PRIMARY KEY)"; statement.execute(sql);

要在Python程序中为字段应用主键,我们需要使用MySQL Connector/Pythonexecute()函数执行包含PRIMARY KEY关键字的CREATE查询,如下所示:

primary_key_query = 'CREATE TABLE TEST (ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID))' cursorObj.execute(primary_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), cust_login_ID INT AUTO_INCREMENT PRIMARY KEY)'; if ($mysqli->query($sql)) { echo "Primary key column created successfully in customers table \n"; } if ($mysqli->errno) { printf("Table could not be created!.", $mysqli->error); } $mysqli->close();

输出

获得的输出如下所示:

Primary key 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 stored primary key sql = `CREATE TABLE customers(cust_ID INT NOT NULL primary key, cust_Name VARCHAR(30))`; 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 PrimaryKey { 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 primary key in the customer table...!; String sql = "CREATE TABLE customers(cust_ID INT NOT NULL UNIQUE, cust_Name VARCHAR(30), cust_login_ID INT AUTO_INCREMENT PRIMARY KEY)"; statement.execute(sql); System.out.println("Primary 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...!
Primary key created successfully...!
cust_ID int NO UNI
cust_Name varchar(30) YES 
cust_login_ID int NO PRI
import mysql.connector #establishing the connection connection = mysql.connector.connect( host='localhost', user='root', password='password', database='tut' ) cursorObj = connection.cursor() # Create table primary_key_query = '''CREATE TABLE TEST (ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID))''' cursorObj.execute(primary_key_query) connection.commit() print("Primary key column is created successfully!") cursorObj.close() connection.close()

输出

以上代码的输出如下:

Primary key column is created successfully!
广告