8.11. ��������

������������һ�л���һ����¼�Ľṹ�� ��ʵ����ֻ��һ���ֶ��������ǵ��������͵��б� PostgreSQL �������������������ʹ�ø������͡� ���磬һ�����ij���ֶο�������Ϊһ���������͡�

8.11.1. ������������

�������������帴�����͵ļ����ӣ�

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);

CREATE TYPE inventory_item AS (
    name            text,
    supplier_id     integer,
    price           numeric
);

�﷨������ CREATE TABLE��ֻ������ֻ���������ֶ����ֺ����ͣ� Ŀǰ��������Լ�������� NOT NULL �����ģ�����ע�� AS �ؼ����Ǻ���Ҫ�ģ� û������ϵͳ����Ϊ������ȫ��ͬ�� CREATE TYPE ��������ῴ����ֵ��﷨����

���������ͣ����ǾͿ�������������

CREATE TABLE on_hand (
    item      inventory_item,
    count     integer
);

INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

���ߺ�����

CREATE FUNCTION price_extension(inventory_item, integer) RETURNS numeric
AS 'SELECT $1.price * $2' LANGUAGE SQL;

SELECT price_extension(item, 10) FROM on_hand;

���㴴�����ʱ��Ҳ���Զ�����һ���������ͣ��������������ͬ����ʾ�ñ�ĸ������͡� ���磬�������˵��

CREATE TABLE inventory_item (
    name            text,
    supplier_id     integer REFERENCES suppliers,
    price           numeric CHECK (price > 0)
);

Ȼ�󣬺�������ʾ����ͬ�� inventory_item ��������Ҳ����Ϊ����Ʒ������ ���ҿ��Ժ�����һ��ʹ�á���������Ҫע��Ŀǰ��ʵ�ֵ�һ����Ҫ���ƣ���Ϊ���ڻ�û��Լ���͸����������ᣬ �����ڱ�������ʾ��Լ�����������ڱ�֮��ĸ������͡� ��һ�������ƿ��İ취��ʹ����������Ϊ�������͵ij�Ա����

8.11.2. ��������ֵ����

Ҫ���ı�������д��������ֵ����Բ�������Χ�ֶ�ֵ�����ö��ŷָ����ǡ� ��������κ��ֶ�ֵ��Χ����˫���ţ����ֵ����������Ż���Բ�������������˫�������� ������ϸ�ڼ����档����ˣ��������ͳ�����һ���ʽ���£�

'( val1 , val2 , ... )'

һ��������

'("fuzzy dice",42,1.99)'

��� inventory_item ������ǰ���Ѿ������ˣ���ô����һ���Ϸ�����ֵ�� Ҫ��һ���ֶ��ǿգ���ô���б�������λ���ϲ�Ҫд�κ��ַ������磬������������ڵ������ֶ�����һ�� NULL��

'("fuzzy dice",42,)'

�������Ҫһ�����ִ��������� NULL��дһ��˫���ţ�

'("",42,)'

����ĵ�һ���ֶ���һ���� NULL ���ִ����������ֶ��� NULL��

����Щ����ʵ����ֻ�������� Section 4.1.2.5 ���۵�һ�����ͳ�����һ���������ӡ� ��Щ����һ��ʼֻ�ǵ����ִ���Ȼ�󴫵ݸ�������������ת�����̡�һ����ȷ���������������DZ���ġ���

����Ҳ������ ROW ���ʽ�﷨�����츴������ֵ�� �ڴ���������£����ַ����������ִ��ı����﷨���򵥣���Ϊ�㲻�ò��Ķ������š� �����Ѿ�������ʹ�������ַ����ˣ�

ROW('fuzzy dice', 42, 1.99)
ROW('', 42, NULL)

ֻҪ���ڱ��ʽ���г���һ���ֶΣ���ô�ؼ��� ROW ��ʵ�����ǿ�ѡ�ģ� ���Կ��Լ�Ϊ

('fuzzy dice', 42, 1.99)
('', 42, NULL)

ROW ���ʽ�﷨��Section 4.2.11 ���и���ϸ�����ۡ�

8.11.3. ���ʸ�������

Ҫ���ʸ��������ֶε�һ��������д��һ�����Լ�������֣��dz����ƴ�һ����������ѡ��һ���ֶΡ� ʵ���ϣ���Ϊʵ��̫��ӱ�������ѡȡ�ֶΣ��������Ǿ�����Ҫ��Բ��������������������� ���磬�������Ҫ�� on_hand ���ӱ���ѡȡһЩ����������������

SELECT item.name FROM on_hand WHERE item.price > 9.99;

���������ܹ�������Ϊ���� SQL �﷨�� item �Ǵ�һ��������ѡȡ�ģ�������һ�������֡� ���������������д��

SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

���������Ҳ��Ҫʹ�ñ����֣����磬��һ������ѯ�����ôд��

SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

����Բ����������ȷ�ؽ���Ϊһ��ָ�� item �ֶε����ã�Ȼ��Ϳ��Դ���ѡȡ����

���Ƶ��﷨�������������κεص��һ����������ֵ�в�ѯһ���� ���磬Ҫ��һ�����ظ�������ֵ�ĺ�����ֻѡ��һ���ֶΣ�����Ҫд�����������Ķ���

SELECT (my_func(...)).field FROM ...

���û�ж����Բ�����������һ���﷨����

8.11.4. �޸ĸ�������

������һЩ����͸��¸��������ֶε���ȷ�﷨�����ȣ�������߸��������ֶΣ�

INSERT INTO mytab (complex_col) VALUES((1.1,2.2));

UPDATE mytab SET complex_col = ROW(1.1,2.2) WHERE ...;

��һ������ʡ���� ROW���ڶ���ʹ���������������ַ������С�

���ǿ��Ը���һ�������ֶεĶ�������

UPDATE mytab SET complex_col.r = (complex_col).r + 1 WHERE ...;

��ע�⣬�������Dz���Ҫ��ʵ�����Dz��ܣ��� SET ������ֵ��ֶ�����Χ����Բ������ ���������ڵȺ��ұߵı��ʽ������ͬһ���ֶε�ʱ��ȴ��ҪԲ������

����Ҳ�������������� INSERT ��Ŀ�꣺

INSERT INTO mytab (complex_col.r, complex_col.i) VALUES(1.1, 2.2);

�������û��Ϊ�ֶε����������ṩ��ֵ����ôʣ�µ������ÿ�ֵ��䡣

8.11.5. �����������������﷨

һ���������͵��ı�������ʽ������Щ���ݶ������������͸��� I/O ת������������ ����һЩ�������Ǹ��Ͻṹ�����Ρ���Щ���ΰ���������ֵ��Χ��Բ������( �� )���� ����������֮��Ķ��ţ�,����Բ��������Ŀհױ����ԣ�������Բ�������棬 ��������������ֵ��һ���֣����ݸ�������������ͣ���Щ�հ׿������ã�Ҳ����û�á� ���磬��

'(  42)'

����������������������ô�հ׽������ԣ�����������ı�����ô�Ͳ�����ԡ�

��ǰ����ʾ���������ڸ�һ����������д��ֵ��ʱ��������ڶ�����������ֵ��Χ��˫���Ű�Χ�� ���������ֵ�ᵼ�¸�����ֵ���������壬��ô��������ô���� �ر����������Բ���������ţ�˫���ţ����߷�б�ܵij��ϣ�������˫������������ Ҫ����˫������������������ֵ�����˫���ţ���ô����Ҫ����ǰ���һ����б�ܡ� ��ͬ������һ��˫���������������ֵ�����һ��˫���ű�ʾһ��˫�����ַ������� SQL �ִ��ı��ĵ����Ź���һ������ ���⣬������÷�б�����ݵķ����������п��ܻᵱ�����������﷨�������ַ���

һ����ȫ�յ�������ֵ���ڶ��Ż��߶�����Բ����֮��û���ַ�����ʾһ�� NULL�� Ҫдһ�����ִ���������һ�� NULL��д ""��

����������ֵ�ǿ��ִ����߰���Բ���������ţ�˫���ţ���б�ܻ��߿հף���������������̻���������ֵ��Χ����˫���š� ��Ϊ�հ���ô�����DZ���ģ����ǿ�����ǿ�׶��ԡ�����һ��������ֵ����Ƕ���˫���źͷ�б�ܽ���д�����ݡ�

ע��: ��ע����д���κ� SQL ������ȱ������ִ��ı�������Ȼ��ŵ����������͡� ��ͼӱ�������Ҫ�ķ�б����Ŀ�����磬Ҫ����һ������˫���ź�һ����б�ܵ� text ����һ������������ֵ� ����Ҫд

INSERT ... VALUES ('("\\"\\\\")');

�ִ��ı��������ȳԵ�һ�㷴б�ܣ��������󸴺����ͷ������Ķ����������� ("\"\\")�� Ȼ���ִ���� text �������͵�������̣���� "\�� �����������Ե��������ͻ���Է�б�������࿴������ bytea�� ��ô���ǿ�����Ҫ����������˸���б���Ի�ȡ�ڴ洢�ĸ���������������һ����б�ܡ��� ��Ԫ����Χ������ Section 4.1.2.2���������ڱ���˫�ݷ�б�ܵ����⡣

��ʾ: �� SQL ������д��������ֵ��ʱ��ROW ������ͨ���ȸ����ı��﷨������ʹ�á� �� ROW �������������ֵ��д���Ͳ�����Ϊ�������͵ij�Ա��д�ķ���һ����