Создайте таблицу со значениями по умолчанию, которые используют столбец первичного ключа в функции
Я просто балуюсь 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
Формат кода делает много полезных вещей, и одна из них - обрезать завершающие пробелы.