2009-05-04 2 views

ответ

4

Да. SQL Anywhere не имеет логического типа данных, поэтому вам нужно закодировать предикат, который дает TRUE, FALSE или UNKNOWN. Другими словами, если ваша функция возвращает 1 или 0 для прохода или отказа, вы должны закодировать ограничение как CHECK (f() = 1).

Обратите внимание, что ИСТИНА и НЕИЗВЕСТНЫЕ оба результата приводят к «проходу»; только результат FALSE приводит к сбою проверки.

В следующем примере показано, как ALTER для таблицы, которая уже содержит данные, для добавления столбца с таким ограничением CHECK.

Брек

CREATE TABLE t (
    pkey INTEGER NOT NULL PRIMARY KEY); 

INSERT t VALUES (1); 
COMMIT; 

CREATE FUNCTION is_filled_in ( 
    IN @value VARCHAR (100)) 
RETURNS TINYINT 
BEGIN 
    IF COALESCE (@value, '') <> '' THEN 
     RETURN 1; 
    ELSE 
     RETURN 0; 
    END IF; 
END; 

ALTER TABLE t ADD c VARCHAR (3) DEFAULT 'xxx' 
    CHECK (is_filled_in (c) = 1); 

-- Works ok... 
INSERT t VALUES (2, 'yyy'); 
COMMIT; 

-- Throws SQLCODE -209 Invalid value for column 'c' in table 't'... 
INSERT t VALUES (3, ''); 
COMMIT; 

SELECT * FROM t; 
+1

И вам понадобилось всего 1 мин, чтобы найти такой длинный ответ вам свой вопрос ?? –

+1

@Stefan: У меня был ответ готов, так что «1 минута» на самом деле отражает то, как я медленный, а не быстро. AFAIK это нормально, чтобы публиковать вопросы с ответами, по крайней мере, в соответствии с FAQ. –

Смежные вопросы