Создайте таблицу со значениями по умолчанию, которые используют столбец первичного ключа в функции

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

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

Вот фрагмент того, что я пробовал до сих пор, но дал мне ошибку "ORA-00984: колонка здесь не разрешена":

CREATE TABLE DATE_DIM
(
    DATE_KEY  DATE NOT NULL,
        CONSTRAINT DATE_KEY_PK PRIMARY KEY (DATE_KEY),
    DAY_NUMBER  NUMBER(2) DEFAULT TO_NUMBER(TO_CHAR(DATE_KEY,'DD')),
    DAY_NAME  VARCHAR(36) DEFAULT TO_CHAR(DATE_KEY,'Day')
)

Если я заменю SYSDATE за DATE_KEYЯ не возвращаю никаких ошибок. Но, предполагая, что все, что я концептуализирую, будет реализовано, мне нужно будет вставить более конкретную дату, чем sysdate... и просто для ясности, никакие другие столбцы не смогут обновляться.

В конечном счете, эта идея будет расширена, чтобы включить другие таблицы с различными типами данных, поэтому я понимаю, если вы задаетесь вопросом, почему бы мне просто не создать большую таблицу, полную дат, используя скрипт, Excel и т. Д. Я просто подумал, что дата измерение предоставило хороший пример, чтобы объяснить, чего я пытаюсь достичь.

Спасибо за вашу помощь.

1 ответ

Решение

Вы можете использовать виртуальные столбцы для чего-то вроде этого. Они рассчитываются на лету на основе выражения, которое определяет столбцы:

CREATE TABLE date_dim (
  Date_Key DATE NOT NULL,
  Day_Number AS (EXTRACT(DAY FROM Date_Key)),
  Day_Name AS (TO_CHAR(Date_Key, 'FMDay'))
)

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

  • Я вообще нашел, что проще не указывать тип для виртуального столбца. Можно, но часто случается что-то странное. Ваша таблица не стала исключением: Oracle пожаловался на VARCHAR2(36) за Day_Name сказав что должно быть как минимум VARCHAR2(75),
  • Я использовал EXTRACT функция, чтобы получить номер дня, потому что я думаю, что это более наглядно для этого; Вы должны использовать то, что вам больше всего удобно.
  • Я использовал формат строки FMDay за Day_Name поскольку Day Код формата возвращает строку, которая является длиной самого длинного имени дня (среда на английском языке), поэтому все другие названия дней будут иметь завершающие пробелы. FM Формат кода делает много полезных вещей, и одна из них - обрезать завершающие пробелы.
Другие вопросы по тегам