SQLite 关键字

SQLite PRIMARY KEY 关键字是一个约束,它用于确保表列中的所有值都是唯一且非空的。一张表只能有一个 PRIMARY KEY 约束,一个主键可以由单列或多列(字段)组成。

SQLite PRIMARY KEY 约束与 CREATE TABLE

下面提到的语句创建一个名为 Employee 的表,其中包含五列:EmpID、Name、City、Age 和 Salary,其中 PRIMARY KEY 约束应用于列 EmpID。

CREATE TABLE Employee (
  EmpID INT NOT NULL PRIMARY KEY,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2)
); 

或者,也可以按如下方式创建:

CREATE TABLE Employee (
  EmpID INT NOT NULL,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2),
  PRIMARY KEY(EmpID)
); 

为 PRIMARY KEY 约束提供名称,并在多个列上定义 PRIMARY KEY 约束(例如 EmpID 和 Name),该语句如下:

CREATE TABLE Employee (
  EmpID INT NOT NULL,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2),
  CONSTRAINT PK_Employee PRIMARY KEY(EmpID, Name)
); 

SQLite PRIMARY KEY 约束与 ALTER TABLE

SQLite 不支持 ALTER TABLE 语句向现有表添加 PRIMARY KEY。但是,这可以通过以下步骤来实现:

  • 应检查外键约束
  • 将表重命名为其他名称
  • 创建一个结构相同但添加了主键约束的新表
  • 将重命名表中的数据复制到新表
  • 最后打开外键约束

例如,要对现有表Employee的EmpID列强制执行PRIMARY KEY约束,可以使用以下语句:

PRAGMA foreign_keys=off;

BEGIN TRANSACTION;

ALTER TABLE Employee RENAME TO Employee_old;

CREATE TABLE Employee (
  EmpID INT NOT NULL PRIMARY KEY,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2)
);

INSERT INTO Employee SELECT * FROM Employee_old;

COMMIT;

PRAGMA foreign_keys=on; 

DROP PRIMARY KEY 约束

SQLite 不支持 ALTER TABLE 或 DROP 语句从表中删除现有的 PRIMARY KEY 约束。为此,可以使用以下步骤:

  • 应检查外键约束
  • 将表重命名为其他名称
  • 创建一个结构相同但删除主键约束的新表
  • 将重命名表中的数据复制到新表
  • 最后打开外键约束

例如,要从现有表 Employee 的 EmpID 列中删除 PRIMARY KEY 约束,可以使用以下语句:

PRAGMA foreign_keys=off;

BEGIN TRANSACTION;

ALTER TABLE Employee RENAME TO Employee_old;

CREATE TABLE Employee (
  EmpID INT NOT NULL,
  Name VARCHAR(255),
  City VARCHAR(100),
  Age INT,
  Salary DECIMAL(18,2)
);

INSERT INTO Employee SELECT * FROM Employee_old;

COMMIT;

PRAGMA foreign_keys=on;