postgresql 表级模式的Postgres字符串截断

bbuxkriu  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(2)|浏览(230)

我在Postgres中有一个表,其模式如下:

create table if not exists cars
(
  id bigserial not null,
  tyre_code varchar(8)
);

表中tyre_code的长度最好不超过8个字符。但是,如果有人提供了一个超过8个字符的字符串,Postgres中是否有一种方法可以在表级模式中截断该字符串的值并插入它?我有另一种选择,即截断Java代码中的值并插入它。然而,这并不理想。我更希望我能在表级别上完成。

For example:
tyre_code provided - ABCDEFGHIJK
tyre_code after truncation - ABCDEFGH

我正在使用Postgres,有Spring和Hibernate。任何帮助都将不胜感激!谢谢!

yb3bgrhw

yb3bgrhw1#

使用现有的表定义或在添加长度检查约束之后;如果尝试插入超过8个字符的列值;它将向您抛出以下错误:
“值太长”
但是;
您可以使用以下方法实现此目标:BEFORE INSERT trigger,具体如下:

CREATE OR REPLACE FUNCTION truncate_tyre_code()
RETURNS TRIGGER AS $$
BEGIN
    NEW.tyre_code = LEFT(NEW.tyre_code, 8);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER truncate_tyre_code_trigger
BEFORE INSERT ON cars
FOR EACH ROW
EXECUTE FUNCTION truncate_tyre_code();

=========================================================如果您正在寻找添加约束来检查postgresql中的列长度;那么您可以尝试:CHECK约束

CREATE TABLE IF NOT EXISTS cars (
  id bigserial NOT NULL,
  tyre_code varchar(8) NOT NULL,
  CONSTRAINT truncated_tyre_code CHECK (LENGTH(tyre_code) <= 8)
);

这是一个working demo using DBFIDDLE
更简化的方式为:

CREATE TABLE IF NOT EXISTS cars (
  id bigserial PRIMARY KEY,
  tyre_code varchar(8) CHECK (LENGTH(tyre_code) <= 8) NOT NULL
);

这是一个working demo
假设您已经有一个表结构,如下所示:

create table if not exists cars
(
  id bigserial not null,
  tyre_code varchar(8)
);

alter table语句中添加额外的约束。

ALTER TABLE cars ADD CONSTRAINT truncated_tyre_code CHECK (LENGTH(tyre_code) <= 8);

ALTER (EXISTING) TABLE DEMO

nfs0ujit

nfs0ujit2#

将列定义为类型text(无长度限制),并使用强制长度的检查约束,然后使用BEFORE触发器截断值:

CREATE TABLE varlen (
   id integer PRIMARY KEY,
   val text CHECK (length(val) <= 8) NOT NULL
);

CREATE FUNCTION trunc_val() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   NEW.val := left(NEW.val, 8);
   RETURN NEW;
END;$$;

CREATE TRIGGER trunc_val BEFORE INSERT ON varlen
   FOR EACH ROW EXECUTE FUNCTION trunc_val();

INSERT INTO varlen VALUES (1, 'a string that exceeds 8 characters');

TABLE varlen;

 id │   val    
════╪══════════
  1 │ a string
(1 row)

相关问题