对于类型字符来说值太长

问题描述 投票:0回答:1

我有一个 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))));```.
sql postgresql
1个回答
0
投票

删除外部

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);
© www.soinside.com 2019 - 2024. All rights reserved.