Изменение SQL CONSTRAINT на основе других полей - PullRequest
1 голос
/ 25 апреля 2009

У меня есть таблица SQL, написанная на MSSQL:

create table [action]
(
    action_id       bigint identity not null,   -- PK
    action_action   char(1) not null,       -- 'C' Call, 'R' Raise, 'F' Fold, 'P' Post
    action_size     decimal(9,2) not null,  -- zero if fold, > zero otherwise

    constraint pk_action primary key clustered (action_id),
    constraint chk_action_action check (action_action in('C','R','F','P'))
)

Я хочу наложить ограничение на столбец action_size так, чтобы:

1) Если action_action равно 'F', то action_size должно быть 0,00 (или ноль, если это более выполнимо) 2) Если action_action является чем-то отличным от 'F', тогда action_size должно быть больше нуля (то есть> = 0,01)

Как мне это выразить? Я попробовал:

constraint chk_action_size check (
    select action_action
        case 'F'    action_size = 0.00
        else        action_size > 0.00
)

... безрезультатно.

Я пишу это на MSSQL 2005, но хотел бы найти решение, которое также работает с MySQL 5.1.34.

Кстати, если вы хотите прокомментировать мою колонку action_action, не стесняйтесь. Либо никогда не будет других допустимых значений для action_action, либо, если они есть, это будет чрезвычайно редко и будет только ~ 1 другое действительное значение.

Ответы [ 3 ]

2 голосов
/ 26 апреля 2009
create table [action]
(
    action_id           bigint identity not null,
    action_action       char(1) not null, 
    action_size         decimal(9,2) not null,

    constraint pk_action primary key clustered (action_id),
    constraint chk_action_action check (action_action in('C','R','F','P')),
    constraint chk_action_size check 
    (
         (action_action = 'F' AND action_size = 0.00) OR
         (action_action <> 'F' AND action_size > 0.00)
     )
)
1 голос
/ 25 апреля 2009
ALTER TABLE action ADD CONSTRAINT chk_action_size CHECK (
    (action_action = 'F' AND action_size = 0.00)
    OR (action_action <> 'F' AND action_size > 0.00)
)

Если вы использовали числа с плавающей точкой вместо десятичных, напишите проверку нуля как:

ABS(action_size) > 0.01

Поскольку числа с плавающей точкой не могут быть точно равны нулю, особенно после некоторой математики.

0 голосов
/ 25 апреля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...