MySQL是否支持检查约束?
我可以在MySQL中执行以下脚本而不会出错.
ALTER TABLE EMP_DB_DESIGN_EXCEL ADD (
CONSTRAINT CHK_EMP_IS_ACTIVE CHECK (IS_ACTIVE IN ('Y','N')));
Run Code Online (Sandbox Code Playgroud)
但是,如果我查询它没有反映:
SELECT * FROM information_schema.TABLE_CONSTRAINTS T where t.table_name='EMP_DB_DESIGN_EXCEL';
Run Code Online (Sandbox Code Playgroud) 我有桌子,下面的片段.
package test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = "code")},
name = "coupons")
public class Coupon implements Serializable {
private static final long serialVersionUID = 5534534530153298987L;
@Id
@GeneratedValue
@Column(name = "id")
private long id;
@Column(name = "available_count")
private Integer availableCount = 1;
public Integer getAvailableCount() {
return availableCount;
}
public void setAvailableCount(Integer availableCount) {
this.availableCount = availableCount;
}
}
Run Code Online (Sandbox Code Playgroud)
如何制约只允许availableCount非负面?
我在SQL Server 2005中有一个带有外键的表,它禁用了大量数据加载,然后重新启用:
例:
alter table table1 nocheck constraint fk_1
go
lots of inserts...
go
alter table table1 check constraint fk_1
go
Run Code Online (Sandbox Code Playgroud)
现在,问题是:有没有办法重新检查这个刚刚插入的数据?
以下条件约束根本不起作用.是否有可能以一种有效的方式制定?
ALTER TABLE eni_trasc_voci_pwr_fatt
ADD CONSTRAINT tvp_constraint_1 CHECK (
CASE WHEN TVP_CODICE_ASSOGGETAMEN = '-' THEN tvp_regione IS NULL
END);
Run Code Online (Sandbox Code Playgroud) 我想将临时表中的一堆记录复制到目标表.问题是某些记录可能违反了目标表中的检查约束,因此我想插入可能的所有内容,并在其他地方为无效记录生成错误日志.
如果我执行:
INSERT INTO target_table
SELECT ... FROM temp_table
Run Code Online (Sandbox Code Playgroud)
如果任何记录违反任何约束,则不会插入任何内容.我可以制作一个循环并逐个手动插入,但我认为性能会更低.
我有一张桌子:
CREATE TABLE dbo."TransportInteraction"
(
"Id" bigint NOT NULL DEFAULT nextval('dbo."TransportInteraction_Id_seq"'::regclass),
"Message" character varying(256),
"TransportActionId" integer NOT NULL,
"TimeCreated" timestamp without time zone NOT NULL,
"TimeInserted" timestamp without time zone NOT NULL,
"TaskId" bigint
)
Run Code Online (Sandbox Code Playgroud)
通常,此表是对任务的映射操作.TransportActionId是一种integer定义行动的类型.某些操作类型对于每个任务必须是唯一的,而有些则不是.
所以我需要一个类型约束:
UNIQUE ("TaskId", "TransportActionId")适用于所有动作TransportActionId != (2||3 || 4).
所以所有行动除了那些ActionId=2,3 or 4.
有任何想法吗?
我试图用postgresql在数据库中插入一些数据,但仍然显示相同的消息:
错误:关系“ empleados”的新行违反了检查约束“ ck_empleados_documento”详细信息:失败行包含(13,22222222,f,Lopez,Ana,Colon 123,1,2,casado,1990-10-10)。
我不知道错误在哪里或什么地方,也找不到解决此问题的方法。这是我尝试插入的内容:
insert into empleados (documento, sexo, apellido, nombre, domicilio, idSecc, cantidadhijos, estadocivil, fechaingreso) values('22222222','f','Lopez','Ana','Colon 123',1,2,'casado','1990-10-10');
Run Code Online (Sandbox Code Playgroud)
这是表的结构:
CREATE TABLE public.empleados
(
idempleado integer NOT NULL DEFAULT nextval('empleados_idempleado_seq'::regclass),
documento character(8),
sexo character(1),
apellido character varying(20),
nombre character varying(20),
domicilio character varying(30),
idsecc smallint NOT NULL,
cantidadhijos smallint,
estadocivil character(10),
fechaingreso date,
CONSTRAINT pk_empleados PRIMARY KEY (idempleado),
CONSTRAINT fk_empleados_idsecc FOREIGN KEY (idsecc)
REFERENCES public.puestos (idpuesto) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT uq_empleados_documento UNIQUE (documento), …Run Code Online (Sandbox Code Playgroud) 有没有办法让列具有完全如此多的字符?我有一个152个字符的字符串,并希望列只接受长度为152的值,而不是151,而不是153.我知道char可以处理溢出,但最小版本呢?
关于是否更少检查约束更好或更多的任何建议?如果有的话,他们应该如何分组?
假设我有3列VARCHAR2(1 BYTE),每列都是'T'/'F'标志.我想为每个列添加一个检查约束,指定只IN ('T', 'F')允许使用字符.
我应该有3个单独的检查约束,每列一个:
COL_1 IN ('T', 'F')
COL_2 IN ('T', 'F')
COL_3 IN ('T', 'F')
Run Code Online (Sandbox Code Playgroud)
或者一个检查约束:
COL_1 IN ('T', 'F') AND COL_2 IN ('T', 'F') AND COL_3 IN ('T', 'F')
Run Code Online (Sandbox Code Playgroud)
我的想法是最好将这三个分开,因为列在逻辑上彼此无关.唯一的情况是我会检查一个以上列的检查约束,如果一个值与另一个值之间存在某种关系,例如:
(PARENT_CNT > 0 AND PRIMARY_PARENT IS NOT NULL) OR (PARENT_CNT = 0 AND PRIMARY_PARENT IS NULL)
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个检查约束以防止人们将 a 更改sales_status为3除非progression_status是80。
我以为是
ALTER TABLE mytable
ADD CONSTRAINT sales_status_cant_be_3_for_nonprogressed
CHECK (((sales_status = 3 ) or (progression_status < 80)))
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个错误,指出某些行违反了它。当我运行查询时
select * from mytable where sales_status = 3 and progression_status < 80
Run Code Online (Sandbox Code Playgroud)
我没有得到预期的结果。但是我似乎无法使检查约束起作用
sql ×4
database ×3
postgresql ×3
oracle ×2
sql-server ×2
firebird ×1
foreign-keys ×1
hibernate ×1
indexing ×1
interbase ×1
java ×1
mysql ×1
pgadmin ×1