Регулярное выражение в "CREATE TABLE" - PullRequest
0 голосов
/ 03 декабря 2018

У меня следующая проблема: я хочу создать таблицу Client с его идентификатором и именем.Я также хочу проверить, содержит ли поле Имя только буквы.Вот мой запрос:

CREATE TABLE CLIENT(
ID NUMBER PRIMARY KEY, 
FIRST_NAME CHAR(10) CONSTRAINT NAME_CHECK CHECK(REGEXP_LIKE(FIRST_NAME, '^[A-Za-z]*$'))
);

Скрипт работает просто отлично, таблица создается.Но следующая инструкция INSERT

INSERT INTO CLIENT VALUES(1, 'BOB');

не работает.Вот текст ошибки:

INSERT INTO CLIENT
VALUES(1, 'BOB')
Error report -
ORA-02290: check constraint (TASK8.NAME_CHECK) violated

Я уверен, что причина этой ошибки совершенно очевидна, но я просто не понимаю ее.У меня никогда не было проблем с регулярными выражениями.

Заранее спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Я предполагаю, что проблема в пробелах.CHAR() типы данных автоматически дополняются пробелами до длины.

По этой причине строки переменной длины используются намного чаще, чем строки фиксированной длины.В Oracle это будет тип VARCHAR2():

CREATE TABLE CLIENT (
    ID NUMBER PRIMARY KEY, 
    FIRST_NAME VARCHAR2(10) CONSTRAINT NAME_CHECK CHECK (REGEXP_LIKE(FIRST_NAME, '^[A-Za-z]*$'))
);

Я могу добавить еще несколько заметок:

  • Я большой поклонник первичного ключа, являющегося clientId или client_id в этом случае, а не общий id.Это позволяет большинству ссылок на внешние ключи использовать одно и то же имя.
  • 10 символов слишком мало для имени.
...