我有一个 SQL 文件,我想在 Postgresql 数据库中执行。该文件包含用于创建表和复合类型的 SQL 语句,然后将一些值插入到创建的表和复合类型中。
CREATE TYPE address_object AS (
state char(2),
zip char(10)
);
CREATE TYPE embedded_address AS (
state char(2),
zip char(10),
preaddr address_object
);
CREATE TYPE address_value AS (
state char(2),
zip char(10)
);
CREATE TYPE person AS (
name char(20),
age numeric,
address address_object
);
CREATE TABLE customerval (
custno numeric,
addr address_value
);
CREATE TABLE extaddr OF address_object;
CREATE TABLE customerobj (
custno numeric,
addr address_object
);
CREATE TABLE embextaddr OF embedded_address;
CREATE TABLE emp (
emp_id numeric,
emp_info person
);
CREATE TABLE empref (
emp_id numeric,
emp_info person
);
CREATE TABLE extper OF person;
-- Insert data
INSERT INTO customerval VALUES (100, ROW('CA'::char(2), '94065'::char(10)));
INSERT INTO extaddr VALUES (ROW(LEFT('CA', 2), CAST('94065' AS CHAR(10))));
INSERT INTO extaddr VALUES (ROW(LEFT('CA',2),CAST('98765' AS char(10))));
INSERT INTO extaddr VALUES (ROW(LEFT('CA' ,2),CAST('95117' AS char(10))));
INSERT INTO embextaddr VALUES (ROW(LEFT('CA',2),CAST('95117' AS char(10), NULL))));
当我运行该文件时,出现一些错误,例如第一个插入语句: 错误:值对于字符类型来说太长(2) 2语句:INSERT INTO extaddr VALUES (ROW(LEFT('CA', 2), CAST('94065' AS CHAR(10)))); psql:file.sql:53: 错误: 对于字符类型 (2) 来说值太长
数据库中创建了表和复合类型,并且第一次插入成功。由于上述错误,最后三个插入语句失败。
INSERT INTO extaddr VALUES (ROW(LEFT('CA', 2), CAST('94065' AS CHAR(10))));```.
row()
构造函数。
CREATE TABLE my_table OF my_type;
创建了一个具有 my_type
类型的单列的表 - 事实并非如此。 来自文档:
创建类型表后,列的数据类型由基础复合类型决定
每一行都遵循类型的结构,只有当你遇到 type-in-type 排序的情况时才需要封装值,就像第一个插入中的
customerval.address_value
一样。 db<>fiddle 的演示:
INSERT INTO customerval VALUES (100, ROW('CA'::char(2), '94065'::char(10)));
INSERT INTO extaddr VALUES (LEFT('CA', 2), CAST('94065' AS CHAR(10))) ;
INSERT INTO extaddr VALUES (LEFT('CA',2),CAST('98765' AS char(10)));
INSERT INTO extaddr VALUES (LEFT('CA' ,2),CAST('95117' AS char(10)));
INSERT INTO embextaddr VALUES (LEFT('CA',2),CAST('95117' AS char(10)), NULL);