私は3つの列を持つテーブルがあるとしましょう。シリアルID、従業員名、および従業員給与。データがこのテーブルに挿入されるたびに、シリアルID列は1,2,3,4などのように増分されます。次の部分は、データが削除されるたびに、シリアルIDの値全体が調整されます。行の削除は、開始行、最後の行、またはテーブル内の任意の場所で実行できます。これをPL/SQLを介してどのように行うのでしょうか。シリアル番号を更新しています。データの挿入とデータの削除のイベントのテーブルで
0
A
答えて
0
これは、以下の手順で行うことができますが、テーブルから直接削除することはできません。代わりに、同じ構造のビューから削除して、代わりのトリガを使用して親テーブルを更新することができます。また、従業員テーブルからIDを削除するので、その従業員を一意に識別する少なくとも1つの他のキーが存在する必要があります。すべてのこれらの前駆体を考慮して、ここに手順があります。
UNIQUE KEY
を作成すると、employee_name
になります。 employee_nameが表全体で常に一意であることを確認できる場合は、この手順は必須ではありません。しかし、従業員の記録がわからない場合、それを特定する方法はありません。
ALTER TABLE emp ADD CONSTRAINT emp_uk UNIQUE(employee_name);
次へemp
テーブルと同じ定義を持つビューを作成します。
CREATE OR REPLACE VIEW emp_view AS
SELECT * FROM EMP;
行方向選択クエリがRANK()
機能を使用して再計算emp_id
をフェッチしているとmerge
文はEMPを更新しているここでの操作ビューに emp_view
CREATE OR REPLACE TRIGGER trigg_emp_v INSTEAD OF
DELETE ON emp_view FOR EACH ROW
BEGIN
DELETE
FROM EMP
WHERE emp_id = :OLD.emp_id ;
MERGE INTO EMP e USING
(SELECT RANK() OVER (ORDER BY emp_id) emp_id,
employee_name,
salary
FROM
(SELECT * FROM emp WHERE emp_id != :OLD.emp_id
)
) v ON (e.employee_name = v.employee_name)
WHEN MATCHED THEN
UPDATE SET e.emp_id = v.emp_id;
END;
/
を削除するためのINSTEAD OF TRIGGER
を作成します。表。削除後ID = 5
Before Deletion
SELECT * FROM EMP;
EMP_ID EMPLOYEE_NAME SALARY
---------- ---------------------------------------- ----------
1 EMPLOYEE_1 1001
2 EMPLOYEE_2 1002
3 EMPLOYEE_3 1003
4 EMPLOYEE_4 1004
5 EMPLOYEE_5 1005
6 EMPLOYEE_6 1006
7 EMPLOYEE_7 1007
8 EMPLOYEE_8 1008
9 EMPLOYEE_9 1009
10 EMPLOYEE_10 1010
--------------------------------------------------------------------
削除操作
DELETE FROM EMP_VIEW where emp_id = 5;
ため
テスト、出力は次のようなものです。
SELECT * FROM EMP;
EMP_ID EMPLOYEE_NAME SALARY
---------- ---------------------------------------- ----------
1 EMPLOYEE_1 1001
2 EMPLOYEE_2 1002
3 EMPLOYEE_3 1003
4 EMPLOYEE_4 1004
5 EMPLOYEE_6 1006
6 EMPLOYEE_7 1007
7 EMPLOYEE_8 1008
8 EMPLOYEE_9 1009
9 EMPLOYEE_10 1010
あなたのフィードバックを教えてください。
関連する問題
- 1. テーブルの挿入、更新、削除イベントのキャプチャ別のテーブルへのトリガと挿入
- 2. 更新されたデータの挿入と削除
- 3. 上書き挿入の更新は外部テーブルのデータを更新します
- 4. 挿入データは、あるクエリでFKと他のテーブルを更新
- 5. asp.netでSQLデータから画像を挿入/更新/削除
- 6. 複数のテーブルでの関係の挿入、更新、削除
- 7. データの挿入/更新
- 8. 前のデータを削除して新しいデータに更新する
- 9. 別のテーブルにコピーし、テーブルから新しいデータを挿入
- 10. すべてのデータを削除してから新しいデータを挿入する方法
- 11. 更新データのcodeigniterデータベースエラー番号1064
- 12. cakephpのテーブルの古いデータと比較して複数の行を挿入して削除する方法は?
- 13. Express Router CRUDデータの更新と削除
- 14. 削除データは、挿入バルク文の
- 15. キャンパスデータベースのazureテーブルへのデータの挿入/更新
- 16. WPF DataContextのSQL更新、削除、挿入
- 17. 挿入/更新/削除後のsqlalchemyフラスコ
- 18. DataGridViewの更新/削除/挿入
- 19. Androidの挿入/更新/削除SQLiteクエリ
- 20. 新しいテーブルを作成して別のテーブルからデータを挿入する
- 21. SQL:1つのテーブルのデータを使用して別のテーブルに新しいデータを挿入する
- 22. WordPress重力フォームのデータを新しいテーブルに挿入する
- 23. 古いテーブルから新しいテーブルにデータを挿入する
- 24. MYSQL JAVAのテーブルにデータを更新しないクエリを挿入する
- 25. 重複した更新で新しいデータを挿入する
- 26. Datagridのデータの更新/削除
- 27. 新しいデータを削除せずに古いデータベースから新しいデータベースにデータを挿入する
- 28. Talendテーブルにデータを挿入または更新する
- 29. ハイブ - 新しいテーブルを作成し、更新されたデータを挿入する
- 30. 削除されたデータをテーブルに挿入するトリガー
「シリアルIDの値全体が調整される」とはどういう意味ですか?サンプルデータを詳しく説明してください。 –
シーケンスから生成された実際のID値を持つ追加の列を1つ追加することをお勧めします(これは、その列にあるインデックスやPK制約に適しています)。次に、テーブルにレコードを挿入するプロシージャ、またはトリガ(挿入、更新、削除トリガーの前)のいずれかで、好きなように列を調整してからOracleがコミットします(この場合もちろんコードで)。 – g00dy
@KaushikNayak。 "シリアルIDの値全体が調整されます"とは、テーブルに10行あり、シリアルIDが1から10まで作成されたと仮定します。最後の行が削除された場合(これは簡単な部分です)シリアルID最初の行が削除された場合、2番目の行はシリアルID = 1、3番目の行はシリアルID = 2などとなります。 5行目が削除された場合、最初の4行は変更されずに6行目はシリアルID = 5、7行目はシリアルID = 6となります。このイベントは、削除が発生するたびに自動的に発生する必要があります。 – tapabrata