0

さて、いくつかの行をテーブル (DBO.ORDERDATA) に挿入し、他の列の値をそのまま保持する列 (単価) に数学的な変更 (ここでは -1 を掛ける) を行う必要があります。

コードは次のとおりです。Northwind DB を考慮すると、次のようになります。

CREATE TABLE DBO.ORDERDATA
(
    OrderID INT NOT NULL,
    ProductID INT NOT NULL,
    UnitPrice MONEY NOT NULL,
    Quantity SMALLINT NOT NULL,
    Discount REAL NOT NULL
)

INSERT INTO DBO.ORDERDATA
SELECT * FROM DBO.[Order Details]

挿入コードは次のとおりです。

INSERT INTO DBO.ORDERDATA (OrderID, ProductID, UnitPrice, Quantity, Discount)
    SELECT 
        OrderID, ProductID, UnitPrice * -1, Quantity, Discount 
    FROM 
        DBO.ORDERDATA
    WHERE 
        OrderID = 10530 

キー制約が多いため、組み込みの DBO.[Order Details] テーブルをエスケープしました。私は少し怠け者です ;)

最後に、すべての列名を指定する必要がない上記の挿入スクリプトの代替手段。シナリオによっては、1 つの列が ID 列である可能性があることに注意してください。

すべての回答とコメントをお待ちしております。

4

1 に答える 1

0

OrderID、または OrderID と ProductID の組み合わせが PK の場合、PK を複製する挿入は PK 制約違反で失敗します。すでに存在する 10530 を挿入しようとしています。

OrderID が IDENTITY 自動インクリメント フィールドの場合、次のように動作し、新しい OrderID 値が作成されます。

INSERT INTO DBO.ORDERDATA(ProductID,UnitPrice,Quantity,Discount)
SELECT ProductID,UnitPrice*-1,Quantity,Discount FROM DBO.ORDERDATA
WHERE OrderID=10530 

主要な制約を扱いたくない場合もありますが、実際には、このデータについて重要なことを伝えています。たとえば、OrderID と ProductID の組み合わせが PK の場合、テーブルにはそのキー値の組み合わせを持つレコードが 1 つだけ含まれている必要があります。この方法で重複を挿入したくないはずです。

重複を挿入しようとしている理由は何ですか? この注文に「クレジット」を実装しようとしている場合は、データの整合性を損なわずにこれを実装する方法を考えた方がよいかもしれません。鍵は正当な理由があります。たとえば、このデータが何を意味するかを説明するのに最適な場合は、「transactiontype」フィールドを複合キーに追加できます。

すべてのフィールドに名前を付けずにレコードを挿入しようとすると、同じことが当てはまります。次の場合は回避できますが、なぜ回避したいのですか? フィールド名は、挿入の完全性にとって重要です。

列が column_list にない場合、データベース エンジンは列の定義に基づいて値を提供できる必要があります。そうしないと、行をロードできません。列が次の場合、データベース エンジンは列の値を自動的に提供します。

  1. IDENTITY プロパティを持っています。次の増分 ID 値が使用されます。

  2. デフォルトあり。列のデフォルト値が使用されます。

  3. タイムスタンプ データ型があります。現在のタイムスタンプ値が使用されます。

  4. null 可能です。null 値が使用されます。

  5. 計算列です。計算値が使用されます。

于 2013-05-08T18:19:25.727 に答える