2

「クエリを変更して、新しい給与から古い給与を差し引く列を追加します。列に増加のラベルを付けます。修正したクエリを実行します。」

さて、私の解釈によると、最初にスクリプトを作成して列を追加しようとしました。

ALTER TABLE EMPLOYEES ADD (
    INCREASE2   NUMBER(6));

それで:

INSERT INTO EMPLOYEES(INCREASE2)
SELECT (salary*1.155) - salary FROM EMPLOYEES;

SQL エラー: ORA-01400: não é possível inserir NULL em ("HR"."EMPLOYEES"."EMPLOYEE_ID") 01400.00000 - "(%s) に NULL を挿入できません"

"HR"."EMPLOYEES"."EMPLOYEE_ID"主キーです。

  1. NULL 値を挿入しようとしているわけではありません。
  2. オラクルが私のエントリを受け入れない理由がわかりません。基本的な挿入を実行して、式に構文エラーがないかどうかを確認しようとしました。

    INSERT INTO EMPLOYEES(INCREASE2)
    VALUES ('whatever');
    

それでもエラーが発生しました。

次に、列をnull以外に変更しようとしました

ALTER TABLE EMPLOYEES
MODIFY
(INCREASE2  NUMBER(6) NOT NULL);

と:

02296 00000 - "(%s.%s)を有効にできません - NULL値が見つかりました"
*原因: 表に制約
を満たさない値が含まれているため、ALTER TABLE ENABLE制約が失敗しました。
*アクション: 明らか

演習の簡単な解決策を見つけましたが、それでもコードが成功しなかった理由に興味があります。

解像度:

SELECT employee_id, last_name, salary,
    ROUND(salary * 1.155, 0) "New Salary",
    ROUND(salary * 1.155, 0) - salary "Increase"
FROM employees;
4

4 に答える 4

5

employees.employee_id列がデフォルト値のない null 以外のフィールドであるため、コードは成功しませんでした。実行すると:

INSERT INTO EMPLOYEES(INCREASE2)
    VALUES ('whatever');

の他のすべてのフィールドの値にはEmployees、デフォルトが割り当てられるNULLか、デフォルト値が存在しない場合に割り当てられます。これは制約に違反しているため、エラーが発生します。

通常、フィールド likeemployee_idはシーケンスに割り当てられます。これにより、新しいレコードごとに自動インクリメントされた値が自動的に挿入されます。

于 2013-12-28T17:38:21.893 に答える
1

これは挿入ではなく更新ではないでしょうか。新しいレコードを挿入しても、追加したばかりの新しい列にデータを入力するというコンテキストでは意味がありません。

update employees
set increase2 = ROUND(salary * 1.155, 0)  - salary;
于 2013-12-28T20:22:09.693 に答える
1

「クエリを変更して、新しい給与から古い給与を差し引く列を追加します。列に [増加] というラベルを付けます。修正したクエリを実行します。」

したがって、最後の解決策は問題ないはずです。実際のテーブルを変更する必要はありません。

于 2013-12-28T20:30:37.257 に答える