R4 午後Ⅰ 問2 設問1(3)(表2)SQL2
ますさん
(No.1)
初めて投稿させていただきます。
標題についてですが、
SQL1で商品テーブルに列を追加する際には、以下のSQLが実行されていると思います。
"ALTER TABLE 商品 ADD COLUMN DEFAULT CURRENT_DATE NOT NULL"
気になったのが、続くSQL2で、
「"商品"テーブルの更新時に、適用開始日がNULLの場合、現在日付に更新する」
の部分です。
商品テーブルの適用開始日には、SQL1で、
①デフォルト値(現在日付)
②NOT NULL制約
を設定しているため、既存の行の適用開始日にも現在日付が登録され、「適用開始日がNULLの場合」は存在しないと思っていたのですが...
データベース実装によっては、①も②も、既存の列には適用されないことがある、という理解になるのでしょうか...?
(MySQLを少し触った際には、既存の行にも追加した列にはデフォルト値が入っていた記憶があり...あくまでMySQLがそうだというだけ...?)
標題についてですが、
SQL1で商品テーブルに列を追加する際には、以下のSQLが実行されていると思います。
"ALTER TABLE 商品 ADD COLUMN DEFAULT CURRENT_DATE NOT NULL"
気になったのが、続くSQL2で、
「"商品"テーブルの更新時に、適用開始日がNULLの場合、現在日付に更新する」
の部分です。
商品テーブルの適用開始日には、SQL1で、
①デフォルト値(現在日付)
②NOT NULL制約
を設定しているため、既存の行の適用開始日にも現在日付が登録され、「適用開始日がNULLの場合」は存在しないと思っていたのですが...
データベース実装によっては、①も②も、既存の列には適用されないことがある、という理解になるのでしょうか...?
(MySQLを少し触った際には、既存の行にも追加した列にはデフォルト値が入っていた記憶があり...あくまでMySQLがそうだというだけ...?)
2023.08.12 16:52
GinSanaさん
★DB ゴールドマイスター
(No.2)
>データベース実装によっては、①も②も、既存の列には適用されないことがある、という理解になるのでしょうか...?
Oracleだと、
create テーブル personal(id varchar2(2), name varchar2(4));
インサート イントゥ personal セレクト ’01’ as id, ’hoge’ as name フロム dual;
ALTER テーブル personal ADD NOWDATE date DEFAULT sysdate not null;
でも
ALTER テーブル personal ADD NOWDATE date DEFAULT sysdate;
でも
セレクト アスタ フロム personal;
ID NAME NOWDATE
01 hoge 2023-08-12T08:50:08Z
が入った。
SQLite3は、SQLite3の仕様で不定値をデフォルト値にできないので、このSQLはできない。
postgresは、
create テーブル personal(id varchar(2), name varchar(4));
インサート イントゥ personal セレクト ’01’ as id, ’hoge’ as name;
ALTER テーブル personal ADD NOWDATE date DEFAULT current_timestamp;
セレクト アスタ フロム personal;
id name nowdate
01 hoge 2023-08-12
が入った。
>気になったのが、続くSQL2で、
>「"商品"テーブルの更新時に、適用開始日がNULLの場合、現在日付に更新する」
>の部分です。
たしかに、なんででしょうね。
SQL99のChapter 18 -- SQL テーブル and Viewによると
ADD [ COLUMN ] Clause
The effect of ALTER テーブル <テーブル name> ADD [COLUMN] <Column definition>, e.g.:
(・・・)
The value of the new Column for every existing row of the テーブル is set to its default value.
なので、ANSIの仕様としてはもう値は入っていることになってます。The effect of ALTER テーブル <テーブル name> ADD [COLUMN] <Column definition>, e.g.:
(・・・)
The value of the new Column for every existing row of the テーブル is set to its default value.
2023.08.12 18:07
ますさん
(No.3)
各製品、規格のご調査までありがとうございます...!
そうすると前提が微妙という話になってしまうのですかね...
ちなみになのですが、
SQL99はドキュメントを購入されていらっしゃるのでしょうか。
そうすると前提が微妙という話になってしまうのですかね...
ちなみになのですが、
SQL99はドキュメントを購入されていらっしゃるのでしょうか。
2023.08.13 16:38
GinSanaさん
★DB ゴールドマイスター
(No.4)
>そうすると前提が微妙という話になってしまうのですかね...
これが、列をMODIFYでdefaultを設定した場合、デフォルト値は入らないので、まあやりたいことはわかるんですが、今回のケースはまあ安全側に倒す仮説以上の意味は実質ありません。そのルートはまあいらんでしょうが、実運用的にはいらん、といっても一応やれとかいう偏屈なやつもいるので、なんともいえません。
>SQL99はドキュメントを購入されていらっしゃるのでしょうか。
crate/sql-99: SQL-99 Complete, Really
のgithubにあるやつから探してます。
2023.08.13 16:48
ますさん
(No.5)
ありがとうございます。
一応念のため...と言われるとこのような記述にする意味も汲み取れる気がしました。
この辺りでそんなものかといなせるか否かに実務経験の差が出る気がします...
のgithub
ご教示いただきありがとうございます!
(ここの投稿フォームは一部除きリンクは貼れないのですね...)
>安全側に倒す
一応念のため...と言われるとこのような記述にする意味も汲み取れる気がしました。
この辺りでそんなものかといなせるか否かに実務経験の差が出る気がします...
>crate/sql-99: SQL-99 Complete, Really
のgithub
ご教示いただきありがとうございます!
(ここの投稿フォームは一部除きリンクは貼れないのですね...)
2023.08.13 17:05
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。