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 約束。

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 表:

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 的列包含重複值或空值,則無法將其設定為主鍵。

刪除 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://: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!
廣告