Как предотвратить ввод определенных букв с помощью Oracle - PullRequest
0 голосов
/ 14 марта 2020

Код является категорией видео, он представлен одним символом в верхнем регистре, исключая I, O, Q, V, Y и Z, за которым следует символ c.

Итак далеко я угадал и получил это. Любые предложения о том, как это исправить?

create table channelTable (
    channelID number NOT NULL,
    ChannelName varchar(100) NOT NULL,
    ChannelDate date NOT NULL,
    UserName varchar(100) NOT NULL UNIQUE,
    TopicCode varchar(4) NOT NULL);

    CONSTRAINT channelID_pk PRIMARY KEY (channelID)
    CONSTRAINT c_topicCode LIKE '[A-Za-z][0-9] NOT (I,O,Q,N,Y,Z)
);

Ответы [ 3 ]

3 голосов
/ 14 марта 2020

Некоторые комментарии:

  • NOT NULL не требуется для PRIMARY KEY столбцов.
  • В Oracle, используйте VARCHAR2().

Тогда я бы предложил регулярные выражения. Если предполагается, что значение ровно из двух символов, объявите его следующим образом:

create table channelTable (
    channelID number,
    ChannelName varchar(100) NOT NULL,
    ChannelDate date NOT NULL,
    UserName varchar2(100) NOT NULL UNIQUE,
    TopicCode char(2) NOT NULL;

    CONSTRAINT channelID_pk PRIMARY KEY (channelID)
    CONSTRAINT check (REGEXP_LIKE(c_topicCode, '^[A-HJ-NPR-UYZ][0-9]$') 
);

Или, возможно, проще:

    CONSTRAINT REGEXP_LIKE(c_topicCode, '^[A-Z][0-9]$') AND NOT REGEXP_LIKE(c_topicCode, '^[IOQNYZ]'))

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

2 голосов
/ 14 марта 2020

Используйте регулярное выражение ^[A-HJ-MPR-X]\d$ для сопоставления символа в верхнем регистре, исключая I,O,Q,N,Y,Z, за которым следует di git:

CREATE TABLE channels (
  id        number       CONSTRAINT channel__id__pk   PRIMARY KEY,
  Name      varchar(100) CONSTRAINT channel__name__nn NOT NULL,
  DateTime  date         CONSTRAINT channel__date__nn NOT NULL,
  UserName  varchar(100) CONSTRAINT channel__username__NN NOT NULL
                         CONSTRAINT channel__username__U UNIQUE,
  TopicCode varchar(4),
  CONSTRAINT channel__topiccode__chk CHECK ( REGEXP_LIKE( topiccode, '^[A-HJ-MPR-X]\d$' ) )
);

db <> fiddle

Кроме того, вам не нужно вызывать таблицу channeltable, просто вызывайте ее channels, и вам не нужно добавлять префикс имени столбца к имени таблицы, и вы можете назвать все ограничения (вместо того, чтобы полагаться на на сгенерированных системой именах ограничений, что значительно усложняет отслеживание проблем при отладке).

1 голос
/ 14 марта 2020

Рассмотрим следующую контрольную проверку:

create table channelTable (
    ...
    topicCode varchar(4) not null
        check( 
            substr(c_topicCode, 1, 1) not in ('I', 'O', 'Q', 'V', 'Y', 'Z')
            and regexp_like(topicCode, '^[A-Z]\d')
        ),
    ...
);

Первое условие гарантирует, что код не начинается с одного из запрещенных символов, второе проверяет, соответствует ли он верхнему алфавиту c, за которым следует число.

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

check(regexp_like(topicCode, '^[ABCDEFGHJKLMNPRSTUVWX]\d'))

Это работает в Oracle и в очень последние версии MySQL.

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