sql - 什么时候需要对主键和外键施加约束?

标签 sql database

我是 SQL 的新手,正在创建一小组表。这是代码:

CREATE TABLE Patients_T
          (PatientID            INTEGER(11,0)     NOT NULL,
           PatientName          VARCHAR2(30)      NOT NULL,
           PatientAddress       VARCHAR2(40),     NOT NULL,
           PatientPhone         INTEGER,          NOT NULL,
           CareCenterID         INTEGER(11,0)     NOT NULL,
CONSTRAINT Patient_PK PRIMARY KEY(PatientID))
CONSTRAINT Patient_FK FOREIGN KEY(CareCenterID) REFERENCES CareCenter_T(CareCenterID);

在阅读创建表的示例时,某些表会强制对主键和副键进行上述约束。我不完全明白什么时候应该将 CONSTRAINT 放在主键或辅助键上?既然您总是想要一个唯一的主键,那么它不应该一直存在吗?

最佳答案

你的问题充满了困惑。 “辅助键”不是“外键”。这是一个快速概要。

  1. 您应该始终在表上声明主键。最典型的方式是:

    PatientID INTEGER(11) PRIMARY KEY
    

    (NOT NULL 是可选的,因为它是主键定义的一部分。)

    这是内联版本。您也可以在 CREATE TABLE 语句中的另一行执行此操作:

    PatientID INTEGER(11) NOT NULL,
    . . .
    PRIMARY KEY (PatientId)
    

    或者使用显式的 CONSTRAINT 语句:

    PatientID INTEGER(11) NOT NULL,
    . . .
    CONSTRAINT pk_patients_patientid PRIMARY KEY (PatientId)
    

    所有这三个在本质上是相同的。在某些情况下,命名约束可能很有用。

  2. 您想声明外键。这些也可以是内联的(在大多数数据库中):

    CareCenterID INTEGER(11) NOT NULL REFERENCES CareCenter_T(CareCenterId)
    

    显式声明外键的目的是让数据库保证值的一致性。

  3. 如果另一列或一组列是唯一的,那么您应该将它们声明为唯一的。

关于sql - 什么时候需要对主键和外键施加约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751618/

相关文章:

database - 在 Postgres 中将数据从一个表移动到另一个表的最快方法

sql - Max 和 Min 按 2 列分组

sql - IN 运算符 SQL

sql - mysql 重复记录字段

database - 用于简单读/写(无更新)场景的最佳高性能数据库

java - 如何从firebase数据库获取所有子节点?

django - 数据库级别的 Django 一对一关系和外键关系之间的区别?

sql - 创建 DB2 历史表触发器

PHP 类错误 - 菜鸟

sql - 数据库 : One To Many (or One To None) relationship