mysql - MySQLはtable1への挿入時にtable2に行を自動挿入します

mysql sql

MySQLで、table1に行が挿入されるときにtable2に行を自動的に挿入することは可能ですか?

次の基本構造があるとします。

ユーザーテーブル

id           int(8)       - primary key       - auto increment
username     varchar(20)


UserPrivacyテーブル-userprivacy.userIduser.idの外部キーです

id           int(8)       - primary key       - auto increment
userId       int(8)       - foreign key


user.idなどのクエリを実行したときに、デフォルト値を含むユーザープライバシーテーブルに行を挿入できますか?

トリガー以外の方法はありますか、またはユーザーがINSERT INTO user (username) VALUES ('Bob');に挿入されるたびに2つのクエリを実行するのが最善でしょうか?

次に、すべてのユーザーの値を格納している場合、個別のユーザープライバシーテーブルを用意するのはストレージの無駄ですか?ユーザーテーブルに配置する方が効率的ですか?しかし、私はそれをできるだけ軽くしようとしています...

userテーブルにはさらに列があります。この例では単純にしています。
答え
レコードを別のテーブルに「自動的に」挿入するには、トリガーが必要です。

別のクエリを使用してUserPrivacyにレコードを挿入することが、これを実装する最も一般的な方法です。

1対1の関係の場合、同じテーブルに配置すると、より単純なクエリが可能になります(結合は必要ありません)。

決定、決定...

1対(0対1)の関係では、考慮すべき要素がさらにあります。

UserPrivacyテーブルが大きい場合は、スペースを節約するために別のテーブルに配置するのが理にかなっています。これもより正規化されます。

「PrivacyDataを持たないすべてのユーザーを私に与える」などのクエリを頻繁に行っている場合は、それを別のテーブルに置くのが理にかなっています。インデックスにはNULL値が含まれていないため(デフォルト)、別のテーブルに対してJOINを実行する方が高速です。もちろん、回避策はNULL以外の値を使用して「プライバシー設定なし」を表すことですが、カーディナリティが低いこともパフォーマンスに悪影響を及ぼします。この場合、個別のテーブルが最適です。

また、プライバシーデータが頻繁に更新され、ユーザーデータは更新されなかった場合、個別のテーブルがユーザーテーブルの行ロックを防止し、更新が小さいテーブルでより速くなり、パフォーマンスが向上する可能性があります。

UserDataなしでUserPrivacyデータが頻繁に必要な場合、またはその逆の場合は、それらを分離することができます。

それでも、これは時期尚早の最適化かもしれません。それらがモデルによりよく一致する場合は、それらを分離することをお勧めします。パフォーマンス、サイズ、読みやすさの問題と比較して、同じテーブルにそれを維持する単純さを考慮してください。

関係が1対(0対多)の場合、明らかに別のテーブルが必要になりますが、1対(0対1)の場合はオプションです。

最後に...

理由がある限り、それらを分離することを恐れないでください。
関連記事

php - Zend_Db_Statement_Pdo-> paramsの式で実行

mysql - SSHセッションでmysqldumpを使用するときに表示されるクリアテキストのパスワードエントリ

c# - Entity Framework-DeleteObjectのデータベースへのトリップ数

php - Ajaxフォーム送信ボタンで送信

php - フォームフィールドにphp / mysqlを入力する最も面倒な方法はありますか?

php - このmysql / phpクエリをどのように最適化できますか?

php - MySQLの親子テーブルにより、データベース呼び出しが減少するか、PHPでマージされます

java - SQL SELECTのみのクエリテキスト検証

mysql - Djangoと変換を使用して大きなCSVファイルをMySQLにロードする

php - PHPおよびmySQLでの複数のSELECTクエリと結果のループ