在 oracle 的 table 中插入数据时如何避免 space(s)

How to avoid space(s) while inserting data in a table in oracle

我想避免在 table 的列中使用前导空格和尾随空格。我尝试使用以下检查约束但显示错误 - "invalid relational operator".

alter table employee add (CONSTRAINT trm_name check(trim(name)));
alter table employee add (CONSTRAINT trm_name check(trim(dept)));

假设,我有一名 table 员工,并且希望在两列(名称和部门)上没有前导和尾随空格。谁能帮帮我。

此致, 塔拉克

您可以使用触发器:

CREATE OR REPLACE TRIGGER EMPLOYEE_BIU
  BEFORE INSERT OR UPDATE ON EMPLOYEE
  FOR EACH ROW
BEGIN
  :NEW.DEPT := TRIM(:NEW.DEPT);
END EMPLOYEE_BIU;

您可以使用 CHECK 约束,如下所示:

SQL> CREATE TABLE ABC (
  2  NAME   VARCHAR2(100) CHECK ( NAME = TRIM(NAME) ), -- use CHECK constraint
  3  DEPT   VARCHAR2(100) CHECK ( DEPT = TRIM(DEPT) )  -- use CHECK constraint
  4  );

Table created.

SQL> -- space in name
SQL> INSERT INTO ABC VALUES (' TEJASH ','SO');
INSERT INTO ABC VALUES (' TEJASH ','SO')
*
ERROR at line 1:
ORA-02290: check constraint (TEJASH.SYS_C0014819) violated


SQL> -- space in department
SQL> INSERT INTO ABC VALUES ('TEJASH1',' SO');
INSERT INTO ABC VALUES ('TEJASH1',' SO')
*
ERROR at line 1:
ORA-02290: check constraint (TEJASH.SYS_C0014820) violated


SQL> -- valid record
SQL> INSERT INTO ABC VALUES ('TEJASH1','SO');

1 row created.

SQL>

我假设,特别是,您不希望在这些列中允许非空字符串 完全 空格。

如果是这样,我会用 decode 编写约束,它处理 NULL 约束所需的方式(其中像 NULL=something 这样的等式被视为与 TRUE - 与 WHERE 子句或连接条件中的相同等式不同,后者的处理方式与 FALSE).

相同

例如:

alter table employee 
  add (CONSTRAINT trm_name check(decode(name, trim(name), 1, 0) = 1));

decode returns 1 当且仅当名称为 NULL 名称为非 NULL 并且它没有前导或尾随空格。在所有其他情况下它 returns 0 - 如果 name 都是空格,那么 trim(name)NULLname 不是 NULL, 所以 decode returns 0 并且约束是 FALSE.

注意我们经常把条件写成decode(a, b, 1) = 1的形式(decode的默认return值是NULL,所以这样就可以WHERE 个子句和连接条件 )。在constraints中,NULL = 1TRUE一样处理,所以这个shorthand就不行了;当 ab 不同时,我们必须在 decode 中给出一个非 NULL 的值。