举例说明如何在SQLite中使用PRIMARY KEY

1,072 阅读5分钟

SQLite是一个数据库管理系统,它像MySQL一样用来管理关系型数据库的数据,它也像其他数据库一样包含很多约束,如UNIQUE、PRIMARY KEY和FOREIGN KEY。

那么什么是约束条件,它们在SQLite中是如何工作的?本篇文章是关于约束条件和如何在SQLite中使用PRIMARY KEY约束条件的综合指南。

什么是SQLite中的约束

约束是一种原则,根据这种原则,相同数据类型的数据被插入到表中,它组织了列的结构,也确保了存储在表中的数据的可靠性。有许多约束条件,其中一些是。

  • 主键
  • 外键
  • 唯一约束
  • 默认约束
  • 检查约束

什么是SQLite中的主键(PRIMARY KEY

主键是表的唯一列,它确保在该列中插入的条目应该是唯一的,同时也被用来指代其他表的外键。创建表时可以不使用主键,但如果表使用主键,那么只能给表分配一个主键。当创建一个有各种表的数据库时,主键是非常必要的,为了在不同的数据库之间建立关系,主键被使用。

一个主键必须遵循这些规则。

  • 主键的列不能被定义为NULL值
  • 在主键的列的行中插入的数据应该是唯一的
  • 主键应该被称为另一个表的特定外键
  • 该表只能包含一个主键

在数据库中,主键不能是NULL值,但在SQLite中,由于 "长期以来的编码疏忽",它可以被分配一个NULL值。

一个表应该只有一个主键,但在一个主键中可以定义多个列,当多个列被用作一个主键时,那么它被称为复合主键。

在SQLite中为任何表添加主键有几种方法

在创建表时,有两种方法可以分配主键,它们是:

  • 为表的单列添加主键
  • 为表的多列添加主键

如何在SQLite中为一列分配主键来创建一个表

我们可以通过给单列分配主键来创建一个表,其一般的语法是。

CREATE TABLE TABLE_NAME (column_name1 <datatype> PRIMARY KEY NOT NULL, column_name2 <datatype>);

这个语法的解释如下:

  • CREATE TABLE的子句用于创建一个表
  • 输入表名,而不是table_name
  • 键入列名,而不是column_name1,同时写出其数据类型
  • 使用PRIMARY KEY子句,如果你将列指定为主键,并将其定义为NULL或NOT NULL。
  • 输入第二列的名称,以取代column_name2。

为了理解它,考虑一个例子:我们创建一个学校学生表,有唯一的学生ID,命名为(std_id),和学生名字,命名为(std_name)。在这个表中,学生的名字可以相同,但学生的ID不能相同,所以我们把主键分配给std_id,即。

CREATE TABLE school_students (std_id INTEGER PRIMARY KEY NOT NULL, std_names);

school_students表已经创建,有一个单列作为主键。

如何在SQLite中为多列分配一个主键来创建一个表

我们可以通过为多列分配主键来创建一个表,其一般的语法是。

CREATE TABLE TABLE_NAME (column_name1 <datatype> , column_name2 <datatype>, column_name3 <datatype>, PRIMARY KEY(column_name1, column_name2));

在上面的语法中,我们在语句的末尾定义了主键,括号中的列名将被包含在主键中。

为了理解这个问题,我们再考虑一个表employees_data的例子,我们将用三个列创建这个表,这三个列是emp_id,emp_name和emp_dep,然后我们把emp_id和emp_name作为主键。

CREATE TABLE employees_data (emp_id INTEGER, emp_name TEXT, emp_dep TEXT,emp_name PRIMARY KEY(emp_id, emp_email));

这个表已经被创建,主键有两列。

如何在SQLite中为现有的表添加主键

我们不能使用ALTER子句在SQLite中为现有的表添加主键,但是要为SQLite中的表分配一个主键,我们将遵循以下步骤。

  • 外键约束应该被选中。
  • 将表重命名为其他名称
  • 创建一个新的表,其结构与之前创建的表相同。
  • 将该表的数据复制到该表
  • 删除重命名的表
  • 最后,打开外键约束。

我们在数据库中有一个表,名为students_data,它没有主键,它的内容可以用以下方法显示。

SELECT * FROM students_data;

为了给 "id "分配一个主键,我们将运行以下命令。

PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE students_data RENAME TO new_students_data;
CREATE TABLE students_data (id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL, attendance INTEGER NOT NULL);
INSERT INTO students_data  SELECT * FROM new_students_data;
DROP TABLE new_students_data;
COMMIT;
PRAGMA foreign_keys=ON;

要检查主键是否被分配给名为id的列,请运行以下命令。

PRAGMA table_info([students_data]);

主键已经成功分配给表students_data。

如何删除SQLite中的主键约束

像其他数据库一样,我们不能通过使用DROP和ALTER命令来删除约束,要删除PRIMARY KEY约束,我们应该遵循我们选择在现有表中添加约束的相同程序,重新定义表的结构,而不给任何列定义主键。让我们再考虑一下上面添加主键的例子,我们删除主键的方法是。

PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE students_data RENAME TO new_students_data;
CREATE TABLE students_data (id INTEGER NOT NULL, name TEXT NOT NULL, attendance INTEGER NOT NULL);
INSERT INTO students_data  SELECT * FROM new_students_data;
DROP TABLE new_students_data;
COMMIT;
PRAGMA foreign_keys=ON;

总结

主键是非常有用的,特别是在建立一个表与其他表的关系时,因为外键总是指表的主键,此外,一个表只有一个主键,但它的字段可以是一个或多个。在这篇文章中,我们讨论了在SQLite中如何使用主键,并通过实例讨论了如何将主键分配给一个或多个列,以及分配给已经存在的没有主键的表。