MySQL - 組合主鍵



MySQL **組合主鍵**是由表中兩個或多個列組成的鍵,用於唯一標識一條記錄(同一錶行中值的組合)。它也可以被描述為主鍵在多個列上建立。

在表的多個列上使用組合主鍵,這些列的組合保證了唯一性,即使這些列單獨可能並不保證唯一性。因此,當資料庫表沒有任何列能夠單獨識別表中唯一行(或記錄)時,我們可能需要兩個或多個欄位/列才能從表中獲取唯一記錄/行。

建立 MySQL 組合主鍵

要在 MySQL 表中建立組合主鍵,我們使用 CREATE TABLE 語句中的 PRIMARY KEY 關鍵字在表的兩個或多個列上建立一個主鍵。組合主鍵必須具有以下特性:

  • 組合主鍵可以是外部索引鍵的一部分,也可以不是。
  • 組合主鍵不能為 NULL。
  • 組合主鍵也可以透過組合多個候選鍵來建立。
  • 它也被稱為複合鍵。
  • 複合鍵中的所有屬性都是外部索引鍵。

語法

以下是建立表時建立組合主鍵的語法:

CREATE TABLE table_name(
   column1 datatype, column2 datatype, column3 datatype..., 
   CONSTRAINT composite_key_name 
   PRIMARY KEY(column_name1, column_name2,..)
);

示例

在下面的示例中,我們嘗試建立一個名為 CUSTOMERS 的表,並在 ID 和 NAME 列上新增組合主鍵,如下所示:

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

PRIMARY KEY 新增到 CUSTOMERS 表的 ID 和 NAME 列。插入到這些列中的值的組合必須是唯一的,即使各個列值有重複。

驗證

要驗證是否建立了組合主鍵,讓我們使用 DESC 查詢顯示 CUSTOMERS 表的表定義:

欄位 型別 Null 預設值 額外
ID int NO PRI NULL
NAME varchar(20) NO PRI NULL
AGE int NO NULL
ADDRESS char(25) YES NULL
SALARY decimal(18, 2) YES NULL

刪除 MySQL 組合主鍵

我們可以使用 ALTER TABLE... DROP 語句刪除 MySQL 組合主鍵。

語法

以下是刪除表列中組合鍵的語法:

ALTER TABLE table_name DROP PRIMARY KEY;

示例

使用以下 SQL 語句,我們可以從表中刪除**組合鍵**約束:

ALTER TABLE CUSTOMERS DROP PRIMARY KEY;

驗證

要驗證組合鍵是否已刪除,我們使用 DESC 關鍵字顯示 CUSTOMERS 表:

欄位 型別 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

使用客戶端程式建立組合主鍵

我們也可以在欄位上應用組合鍵約束以使用客戶端程式唯一標識。

語法

要在 PHP 程式中對欄位應用組合鍵,我們需要使用**mysqli**函式**query()**執行“建立/修改”語句,如下所示:

$sql = 'ALTER TABLE customers ADD PRIMARY KEY(cust_Id, cust_Name)';
$mysqli->query($sql);

要在 JavaScript 程式中對欄位應用組合鍵,我們需要使用**mysql2**庫的**query()**函式執行“建立/修改”語句,如下所示:

sql = `CREATE TABLE employee(ID Int NOT NULL, emp_Id INT NOT NULL, emp_Name varchar(25), PRIMARY KEY(ID, emp_Id))`;
con.query(sql);  

要在 Java 程式中對欄位應用組合鍵,我們需要使用**JDBC**函式**execute()**執行“建立/修改”語句,如下所示:

String sql = "Alter TABLE customers ADD PRIMARY KEY(cust_Id, cust_Name)";
statement.execute(sql);

要在 python 程式中對欄位應用組合鍵,我們需要使用**MySQL Connector/Python**的**execute()**函式執行“建立/修改”語句,如下所示:

composite_key_query = 'CREATE TABLE TEST(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, MOBILE BIGINT, CONSTRAINT CK_TEST PRIMARY KEY (ID, MOBILE))'
cursorObj.execute(composite_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.
'); //creating composite key using alter statement. $sql = 'ALTER TABLE customers ADD PRIMARY KEY(cust_Id, cust_Name)'; if ($mysqli->query($sql)) { echo "composite key column created successfully in customers table \n"; } if ($mysqli->errno) { printf("Table could not be created!.
", $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下:

composite 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);

  //creating a composite key column during the table creation...!
  sql = `CREATE TABLE employee(ID Int NOT NULL, emp_Id INT NOT NULL, emp_Name varchar(25), PRIMARY KEY(ID, emp_Id))`;
  con.query(sql);

  //describe table details
  sql = "DESCRIBE TABLE employee";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});          

輸出

生成的輸出如下:

[
    {
      id: 1,
      select_type: 'SIMPLE',
      table: 'employee',
      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 CompositeKey {
   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 composite key in the customers table...!;
         String sql = "Alter TABLE customers ADD PRIMARY KEY(cust_Id, cust_Name)";
         statement.execute(sql);
         System.out.println("Composite 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...!
Composite key created successfully...!
Cust_ID int NO PRI
Cust_Name varchar(30) 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 
composite_key_query = '''CREATE TABLE TEST(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, MOBILE BIGINT, 
CONSTRAINT CK_TEST PRIMARY KEY (ID, MOBILE))'''
cursorObj.execute(composite_key_query)
connection.commit()
print("Composite key column is created successfully!")
cursorObj.close()
connection.close()           

輸出

以下是上述程式碼的輸出:

Composite key column is created successfully!
廣告