2013-03-14 40 views
0

我有兩個表(featurefeatures)彼此相關,我想讓開發人員透明地看到一個表(feature)具有的id(主鍵)。因此,爲了插入一個表(features),您不必將id放在另一個表(feature)中,就可以使用另一個表所具有的輔助鍵。這裏是我的代碼:在表中插入另一個表的列

CREATE TABLE feature(
    id INTEGER NOT NULL, 
    description VARCHAR(15) NOT NULL, 
    value VARCHAR(15) NOT NULL, 
    price MONEY NOT NULL, 

    CONSTRAINT feature_pk PRIMARY KEY(id), 
    CONSTRAINT feature_un UNIQUE(description, value), 
    CONSTRAINT feature_ck_price CHECK(price >= 0) 
); 

CREATE TABLE features(
    name VARCHAR(20) NOT NULL, 
    year NUMERIC(4) NOT NULL, 
    feature_id INTEGER NOT NULL, 

    CONSTRAINT features_pk PRIMARY KEY(name,year,feature_id), 
    CONSTRAINT features_fk_model FOREIGN KEY(name,year) REFERENCES model(name,year), 
    CONSTRAINT features_pk_feature FOREIGN KEY(feature_id) REFERENCES feature(id) 
); 

-- Trigger not working because the features table doesnt have the columns I'm trying to use. 

CREATE TRIGGER trigger_features_get_feature_id 
ON features 
INSTEAD OF INSERT 
AS 
DECLARE 
    @tr_features_name VARCHAR(20), 
    @tr_features_year NUMERIC(4), 
    @tr_features_description VARCHAR(15), 
    @tr_features_value VARCHAR(15), 
    @tr_features_feature_id INT 
SELECT @tr_features_name=(SELECT name FROM INSERTED) 
SELECT @tr_features_year=(SELECT year FROM INSERTED) 
SELECT @tr_features_description=(SELECT description FROM INSERTED) 
SELECT @tr_features_value=(SELECT value FROM INSERTED) 
SELECT @tr_features_feature_id=(SELECT id FROM feature WHERE description = @tr_features_description AND value = @tr_features_value) 
BEGIN 
    PRINT CONVERT(varchar(100),@tr_features_feature_id) + @tr_features_description + @tr_features_value + CONVERT(varchar(100),@tr_features_name) + @tr_features_year 
    INSERT INTO features VALUES(@tr_features_name,@tr_features_year,@tr_features_id) 
END 

我希望能夠執行下列類型的插入,所以不是使用的featureid(自動生成),你可以使用此表的輔助鍵(valuedescription)。

INSERT INTO features(name,year,descripition,value) VALUES('Malibu', 2012, 'colour', 'black'); 
+1

爲什麼不加你通過這4個值的存儲過程,並找到相應的ID值,然後插入記錄你?它避免了觸發器,並且可能更易於閱讀。 – 2013-03-14 18:10:01

+0

我用你的想法,它完美的工作。 – candiani 2013-04-19 20:39:49

回答

0

我關注你@adam說,這是結果

CREATE PROCEDURE [dbo].procedure_insert_features 
@pr_car_name VARCHAR(20) = NULL, 
@pr_car_year NUMERIC(4) = NULL, 
@pr_feature_description VARCHAR(15), 
@pr_feature_value VARCHAR(15) 
AS 
SET NOCOUNT ON 
BEGIN 
DECLARE @pr_feature_id AS INTEGER 
    SET @pr_feature_id = (SELECT ID FROM [automobile].[dbo].[feature] WHERE description = @pr_feature_description AND value = @pr_feature_value); 
    -- PRINT @pr_feature_id 
    IF @pr_feature_id IS NOT NULL 
     BEGIN 
      INSERT INTO [automobile].[dbo].available_features VALUES(@pr_car_name,@pr_car_year,@pr_feature_id); 
    END 
ELSE 
    BEGIN 
     RAISERROR ('ID NOT FOUND, PLEASE CHECK SPELLING', 10,1); 
    END 
END