HOME»データベーススペシャリスト掲示板»R4 午後Ⅰ 問2 設問1(3)(表2)SQL2
投稿する

R4 午後Ⅰ 問2 設問1(3)(表2)SQL2 [0517]

 ますさん(No.1) 
初めて投稿させていただきます。
標題についてですが、
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さん(No.2) 
DB ゴールドマイスター
>データベース実装によっては、①も②も、既存の列には適用されないことがある、という理解になるのでしょうか...?
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の仕様としてはもう値は入っていることになってます。
2023.08.12 18:07
 ますさん(No.3) 
各製品、規格のご調査までありがとうございます...!
そうすると前提が微妙という話になってしまうのですかね...

ちなみになのですが、
SQL99はドキュメントを購入されていらっしゃるのでしょうか。
2023.08.13 16:38
GinSanaさん(No.4) 
DB ゴールドマイスター
>そうすると前提が微妙という話になってしまうのですかね...
これが、列をMODIFYでdefaultを設定した場合、デフォルト値は入らないので、まあやりたいことはわかるんですが、今回のケースはまあ安全側に倒す仮説以上の意味は実質ありません。そのルートはまあいらんでしょうが、実運用的にはいらん、といっても一応やれとかいう偏屈なやつもいるので、なんともいえません。

>SQL99はドキュメントを購入されていらっしゃるのでしょうか。

crate/sql-99: SQL-99 Complete, Really
のgithubにあるやつから探してます。
2023.08.13 16:48
 ますさん(No.5) 
ありがとうございます。
>安全側に倒す
一応念のため...と言われるとこのような記述にする意味も汲み取れる気がしました。
この辺りでそんなものかといなせるか否かに実務経験の差が出る気がします...

>crate/sql-99: SQL-99 Complete, Really
のgithub
ご教示いただきありがとうございます!
(ここの投稿フォームは一部除きリンクは貼れないのですね...)
2023.08.13 17:05
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2016-2024 データベーススペシャリストドットコム All Rights Reserved.

Pagetop