5.4. Լ��

����������Լ�����ǿ����ڱ���洢ʲô���͵����ݵ�һ�ַ����� �������������Ӧ�ã������ṩ��Լ��ʵ����̫�ֲڡ����磬 һ��������Ʒ�۸���ֶο���Ӧ��ֻ��������������û��������������ֻ���������� ����һ���������������Ҫ���������ֶλ����е�������Լ���ֶ����ݡ����磬��һ��������Ʒ��Ϣ�ı��У� ÿ����Ʒ��Ŷ�Ӧ��ֻ��һ�С�

������Щ���⣬SQL���������ֶκͱ��϶���Լ���� Լ������������Ҫ������ʩ�ӵ�һ�п��ơ����һ���û���ͼ��һ���ֶ���洢��Υ��Լ�������ݣ���ô�ͻ��׳�һ������ �������ͬʱҲ��������ֵ����ȱʡֵ�������

5.4.1. ���Լ��

���Լ���������Լ�����͡���������������ij���ֶ������ֵ��������һ������ı��ʽ�����磬Ҫǿ��һ�������IJ�Ʒ�۸� ������ã�

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

����������Լ���������������ͺ��棬�ͺ���ȱʡֵ����һ���� ȱʡֵ��Լ�������������˳�����С�һ�����Լ����һ���ؼ��� CHECK �������һ������Բ������ı��ʽ��ɡ� ���Լ�����ʽӦ�ð�����Լ�����ֶΣ��������Լ����ûʲô�����ˡ�

�㻹���Ը����Լ��һ�����������֡������Ϳ����������Ϣ�������� ��������Ҫ�޸�����ʱ������Բ�ѯ���Լ�����﷨�ǣ�

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CONSTRAINT positive_price CHECK (price > 0)
);

��ˣ�Ҫ����һ������Լ����ʹ�ùؼ���CONSTRAINT�� ���������һ����ʶ����Ȼ���ٸ���Լ�����塣

һ�����Լ��Ҳ�����������ɸ��ֶΡ�������洢һ�������۸��һ���ۿۼۣ��������뱣֤�ۿۼ۱������۵͡�

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

ͷ����Լ������ȥӦ�ú����졣������ʹ����һ���µ��﷨�� ��û�и�����ij���ֶ��ϣ����ڶ��ŷָ����ֶ��б�������һ�������е���ʽ���ֵġ� �ֶζ������ЩԼ����������Ի�ϵ�˳���г���

����˵ͷ����Լ�����ֶ�Լ�������������DZ�Լ������Ϊ�����ֶζ���ֿ�д�� �ֶ�Լ��Ҳ����д�ɱ�Լ�������������ܿ��ܲ��С����������Ҳ������ôд

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

������

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0 AND price > discounted_price)
);

��ֻ�Ƿ��IJ�ͬ��

���ǻ�Ҫ֪��һ�����Լ���ڱ��ʽ���������߿�ֵ��ʱ���ǵõ�����ġ� ��Ϊ��������ʽ������һ���������ǿյ�ʱ�򶼻�ó���ֵ�� ������ЩԼ����������Լ���ֶ��Ͻ�ֹ��ֵ��Ҫȷ��һ���ֶβ�������ֵ�����ǿ���ʹ����һ�ڽ��ܵķǿ�Լ����

5.4.2. �ǿ�Լ��

�ǿ�Լ��ֻ�Ǽ򵥵�����һ���ֶα��벻���ǿ�ֵ��������һ���﷨���ӣ�

CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric
);

һ���ǿ�Լ������д��һ���ֶ�Լ���� �ǿ�Լ���ڹ����ϵ�Ч�ڴ���һ�����Լ�� CHECK (column_name IS NOT NULL)�� ���� PostgreSQL �����һ����ȷ�� �ǿ�Լ��Ч�ʸ��ߡ�ȱ�����㲻�ܸ���ô�����ķǿ�Լ��һ����ȷ�����֡�

��Ȼ��һ���ֶο����ж��Լ����ֻҪ��һ��Լ���������д����һ���Ϳ����ˣ�

CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric NOT NULL CHECK (price > 0)
);

����˳������ν��˳�򲢲�Ӱ��Լ������˳��

NOT NULL Լ���и��෴��Լ����NULL Լ�������Լ��������ζ�Ÿ��ֶα����ǿգ���Ϊ�������ֶ�Ҳûɶ�á� ��ֻ�Ƕ����˸��ֶο���Ϊ�յ��������Ϊ���� SQL ��׼��û�ж��� NULL Լ���� ��˲�Ӧ���ڿ���ֲ��Ӧ����ʹ������ �������� PostgreSQL �����������Լ��ֻ��Ϊ�˺��������ݿ�ϵͳ���ݡ��� ��������Щ�û�ϲ��������Ϊ���Լ�����������Ǻ������ڽű��ļ����л�Լ�������磬����Դ�����������ʼ

CREATE TABLE products (
    product_no integer NULL,
    name text NULL,
    price numeric NULL
);

Ȼ������Ҫ��ʱ����� NOT �ؼ��֡�

��ʾ: �ڴ�������ݿ�������Ҫ���ֶζ�Ӧ�ñ��Ϊ�ǿա�

5.4.3. ΨһԼ��

ΨһԼ����֤��һ���ֶλ���һ���ֶ������������������е����������Ψһ�ġ������﷨��

CREATE TABLE products (
    product_no integer UNIQUE,
    name text,
    price numeric
);

������д���ֶ�Լ�����������

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    UNIQUE (product_no)
);

��д�ɱ�Լ����

���һ��ΨһԼ������һ���ֶΣ���ô��Щ�ֶ��ö��ŷָ��г���

CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    UNIQUE (a, c)
);

����Ҳ���Ը�ΨһԼ���������֣�

CREATE TABLE products (
    product_no integer CONSTRAINT must_be_different UNIQUE,
    name text,
    price numeric
);

ͨ��������ڱ��������л�����У�����Щ���а�����ΨһԼ��������Ǽ����ֶζ���ȣ���ô����Υ����ΨһԼ���� ���������ֱȽ��У���ֵ����Ϊ����ȵġ������ζ�ţ��ڶ��ֶ�ΨһԼ��������£� ���������һ���ֶ��ϴ��ڿ�ֵ����ô�����������ǿ��Դ洢���޶���� ������Ϊ��ѭ SQL ��׼������������˵���� SQL ���ݿ���ܲ���ѭ�����׼����������Ҫ��������ֲ�ij��� ��ô�����ϸЩ��

5.4.4. ����

�Ӽ���������������Լ��ֻ��ΨһԼ���ͷǿ�Լ������ϡ� ���ԣ����������������ͬ�������ݣ�

CREATE TABLE products (
    product_no integer UNIQUE NOT NULL,
    name text,
    price numeric
);

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

����Ҳ����Լ������һ���ֶΣ����﷨����ΨһԼ����

CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    PRIMARY KEY (a, c)
);

������ʾһ���ֶλ��������ɸ��ֶε���Ͽ������ڱ��е������е�Ψһ��ʶ�� �����Ƕ���һ��������ֱ�ӽ������ע��һ��ΨһԼ��ʵ���ϲ������ṩһ��Ψһ��ʾ����Ϊ�����ų���ֵ���� ������ܶ��ĵ�Ŀ�ĺͿͻ�Ӧ�ö������á����磬һ�������޸�����ֵ�� GUI Ӧ�ÿ�����Ҫ֪��һ�������������Ψһ�ر�ʶһ���С�

һ������������һ�������������������ж��Ψһ�ͷǿ�Լ������ ��ϵ�����ݿ����۸������ǣ�ÿ����������һ��������PostgreSQL ����ǿ��������򣬵�������û�����ѭ����

5.4.5. ���

���Լ������һ���ֶΣ�����һ���ֶΣ�����ֵ����ƥ������һ������ijЩ�г��ֵ���ֵ�� ���ǰ������Ϊ����������ر�֮����ο���������

�������и���Ʒ�����ǿ���ʹ���˺ü��Σ�

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

�����Ǽ�������һ���洢��Щ��Ʒ�Ķ����ı� �����뱣֤������ֻ����ʵ�ʴ��ڵIJ�Ʒ����������ڶ������ж���һ�����Լ�����ò�Ʒ��

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    product_no integer REFERENCES products (product_no),
    quantity integer
);

���ڣ����Dz����ܴ����κ��� product_no û���ڲ�Ʒ���г��ֵĶ�����

��������������ǰѶ�������������� ����Ʒ���������������Ƶ�Ҳ�������ֶκͱ������ֶΡ�

��Ҳ���԰�����������д��

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    product_no integer REFERENCES products,
    quantity integer
);

��Ϊ���ȱ���ֶ��б�Ļ��������ñ�������ͻᱻ�����������ֶ�ʹ�á�

һ�����Ҳ����Լ��������һ���ֶΡ�ͬ����Ҳ��Ҫд�ɱ�Լ������ʽ�� ������һ������������﷨���ӣ�

CREATE TABLE t1 (
  a integer PRIMARY KEY,
  b integer,
  c integer,
  FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
);

��Ȼ����Լ�����ֶε���Ŀ��������Ҫ�ͱ������ֶε���Ŀ������һ�¡�

һ������԰�������һ�����Լ���������������ʵ�ֱ�֮���Զ�� ��ϵ���������й��ڲ�Ʒ�Ͷ����ı���������������һ���������԰��� ���ֲ�Ʒ�������Ǹ��ṹ�Dz�������ô���ģ��������ʹ�������Ľṹ��

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products,
    order_id integer REFERENCES orders,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);

��Ҫע�����ı��������������ص��ġ�

����֪����������������κβ�Ʒ���޹صĶ����� �������һ����������֮�󣬶������õIJ�Ʒ��ɾ���˻���ô�죿 SQL Ҳ�����㴦��������⡣��˵�������м���ѡ��

Ϊ��˵��������⣬�����Ƕ�����Ķ�Զ�Ĺ�ϵ�����ƶ������ ���ԣ����������ɾ��һ����Ȼ��һ���������õIJ�Ʒ��ͨ�� order_items������ô���Dz���������ô���� �������ɾ����һ����������ô������Ҳ��ɾ����

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    order_id integer REFERENCES orders ON DELETE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);

���ƺͼ���ɾ�������������ѡ�RESTRICT ��ֹɾ�������õ��С� NO ACTION ����˼������ڼ��Լ����ʱ������������κ������У����׳����� ����㲻�����κζ�������ô������ȱʡ����Ϊ�� ��������ѡ���ʵ�������ǣ�NO ACTION ����Լ������Ƴٵ��������Щʱ�򣬶� RESTRICT ���С��� CASCADE ������ɾ��һ�������õ��е�ʱ������������Ҳ�ᱻ�Զ�ɾ������ ������ֶ��ϵĶ�����������ѡ� SET NULL �� SET DEFAULT�� �����ᵼ���ڱ�������ɾ����ʱ���������ǵ��ֶηֱ�����Ϊ�ջ���ȱʡֵ�� ��ע����Щѡ������������ѱ��۲��Լ���ľ��ء� ���磬���һ���������� SET DEFAULT������ȱʡֵ�����������������ô�����ͻ�ʧ�ܡ�

���� ON DELETE������ ON UPDATE ѡ������ڱ������ֶ��޸ģ����£���ʱ����õġ����õĶ�����һ���ġ�

�йظ��º�ɾ�����ݵĸ�����Ϣ������ Chapter 6 ���ҵ���

�������Ӧ��˵�����ǣ�һ���������Ҫô����һ��������Ҫô����һ��ΨһԼ���� ������������һ��ΨһԼ������ô�����ƥ���ֵ��������ϻ���һЩ�����Ŀ����ԡ� ��Щ�������� CREATE TABLE ��� CREATE TABLE �н��͡�