我正在創建一個名為“Cliente”的表,其中包含一些約束,如下所示:
CREATE TABLE public."Cliente" (
"K_CODCLIENTE" numeric(5) NOT NULL,
"N_NOMBRE1" varchar(15) NOT NULL,
"N_NOMBRE2" varchar(15) NOT NULL,
"N_APELLIDO1" varchar(15) NOT NULL,
"N_APELLIDO2" varchar(15),
"N_DIRECCION" varchar(50) NOT NULL,
"Q_TELEFONO" numeric(10) NOT NULL,
"K_CODREF" numeric(5),
"I_TIPOID" varchar(2) NOT NULL,
"Q_IDENTIFICACION" varchar(10) NOT NULL,
CONSTRAINT "PK_Cliente" PRIMARY KEY ("K_CODCLIENTE"),
CONSTRAINT "UQ_ID_TIPOID_CLIENTE" UNIQUE ("I_TIPOID","Q_IDENTIFICACION"),
CONSTRAINT "CK_CODCLIENTE" CHECK ("K_CODCLIENTE" >= 100),
CONSTRAINT "CK_Q_IDENTIFICACION" CHECK ("Q_IDENTIFICACION" IN ('CC', 'PA', 'CE', 'NI', 'OT'))
);
當我嘗試在其上插入一些值時:
INSERT INTO "Cliente"
VALUES ('101','Juan','Felipe','Ortiz','Rojas','AK 15 no. 28-05','3101125507',null,'CC','51111111');
我收到以下錯誤(在 PostgreSQL 14 中,在 Fedora 上):
[23514] ERROR: new row for relation "Cliente" violates check constraint "CK_Q_IDENTIFICACION"
Detail: Failing row contains (101, Juan, Felipe, Ortiz, Rojas, AK 15 no. 28-05, 3101125507, null, CC, 51111111).
我試圖限制“Q_IDENTIFICACION”列,使其只能填充“CC”、“PA”、“CE”、“NI”或“OT”。
也許我在宣告約束“CK_Q_IDENTIFICACION”時做錯了什么?
uj5u.com熱心網友回復:
似乎您弄亂了值的映射并試圖將 '51111111' 插入到"Q_IDENTIFICACION".
考慮這個帶有格式化的目標列串列的更具啟發性的變體:
INSERT INTO "Cliente"
("K_CODCLIENTE", "N_NOMBRE1", "N_NOMBRE2", "N_APELLIDO1", "N_APELLIDO2", "N_DIRECCION" , "Q_TELEFONO", "K_CODREF", "I_TIPOID", "Q_IDENTIFICACION")
VALUES ('101' , 'Juan' ,'Felipe' , 'Ortiz' , 'Rojas' , 'AK 15 no. 28-05', '3101125507', NULL , 'CC' , '51111111'); -- !
也許您想切換表定義中的最后兩個列名 - 并且(不)相應VALUES地調整串列INSERT?(varchar(2)與varchar(10)似乎也切換了。)
INSERT對于持久化代碼,通常建議在任何情況下都在命令中拼出目標列。
旁白:
重新考慮所有這些討厭的雙引號大寫識別符號。看:
- PostgreSQL 列名是否區分大小寫?
考慮使用普通型別text而不是varchar(n)非常嚴格的字符限制。看:
- 使用資料型別“文本”存盤字串有什么缺點嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/525656.html
