2015-06-17 4 views
0

Я пытаюсь добавить ограничение CHECK к моей колонке для оценки футбольной игры. Формат должен быть таким -> 4-2 (с дефис). Оба числа не могут превышать 999.SQL Check Constraint - как проверить конкретный формат?

Ниже приведено то, что у меня до сих пор, что явно не работает. тип данных столбца является VARCHAR(7)

Constraint ScoreCheck CHECK(Score LIKE '0-999'-'0-999'); 
+6

Пожалуйста, помечать вопрос с базой данных, . Кроме того, вы действительно должны хранить sco re как два отдельных числовых столбца, а не как один столбец строки. Очень глупо хранить числа как строки и хранить два числа в одном поле. –

+1

Почему вы ставите значения в столбце вместо 2? –

+0

Какая СУБД вы используете? Postgres? Oracle? –

ответ

-1

Это можно сделать с помощью регулярного выражения:

Constraint ScoreCheck CHECK(regexp_like(Score, '^[0-9]{1,3}-[0-9]{1,3}$')) 
+0

Как насчет розыгрыша «000-00»;) –

+1

Это не будет препятствовать таким показателям, как '99999-100000' (отсутствуют символы'^'и' $ '). –

+0

@FrankSchmitt: ах, хорошая точка. Я всегда забываю о них. Благодарю. –

2

правильный способ сделать это, чтобы использовать представление или виртуальный столбец. Виртуальные столбцы доступны с 11g. Просто определите виртуальный столбец таблицы, например:

create table . . . 
    WinningScore int, 
    LosingScore int, 
    GameScore as (WinningScore || '-' || LosingScore) 
) 

(Вы также можете использовать alter table для существующей таблицы.)

Here немного праймера на виртуальных колонок.

+0

Почему это * правильный путь *? Я согласен, что во многом оптимальный и/или желательный (и я бы, вероятно, пошел по этому маршруту), но верно, я не уверен. –

+0

@ RenéNyffenegger. , , Потому что есть два отдельных атрибута, баллы для каждой из команд. Каждый атрибут должен храниться в его собственном столбце. Объединение их с дефисом - это выходной формат и не должен управлять моделью данных. –

1

Вместо того, как вы должны использовать REGEXP_LIKE

Constraint ScoreCheck ПРОВЕРКА ( REGEXP_LIKE (Score, '^ [0-9] {1,3} - [0-9] {1,3} $ ');

Кроме того, для дальнейшего использования, вы должны разделить это поле на счет домашней команды и команды ушли счет и сохранить их как целое, так обрабатывать их было бы просто

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