2012-02-14 6 views
1

私のアプリケーションは5種類の車両が必要で、車両の各カテゴリには共通のフィールドがあります。だから、私がしたのは、5つのカテゴリーの車両のそれぞれについて5つのテーブルを作成したのです。そして、それぞれの車両に共通のフィールドを格納するための6番目のテーブル「車両」を作成しました。今では、その特定の車両のカテゴリテーブルINSERT INTOである特定の車両に関連する情報を入力するたびに、共通フィールドをvehicleテーブルに挿入するトリガが実行されます。トリガーは.....ようにmysqlトリガは部分的に動作します

をこの

CREATE TRIGGER `tr_vehicle1_info` AFTER INSERT ON `vehicle1` 
FOR EACH ROW insert into vehicle(categ,year,make,model,vin,user_id,principal_driver) values (1,new.year,new.make,new.model,new.vin,new.user_id,new.principal_driver) 

CREATE TRIGGER `tr_vehicle1_info` AFTER INSERT ON `vehicle2` 
FOR EACH ROW insert into vehicle(categ,year,make,model,vin,user_id,principal_driver) values (2,new.year,new.make,new.model,new.vin,new.user_id,new.principal_driver) 

CREATE TRIGGER `tr_vehicle1_info` AFTER INSERT ON `vehicle3` 
FOR EACH ROW insert into vehicle(categ,year,make,model,vin,user_id,principal_driver) values (3,new.year,new.make,new.model,new.vin,new.user_id,new.principal_driver) 

ように見えるので、これで問題は、私は車のための情報を挿入したときにトリガが実行されるということで、値がテーブルvehicleに挿入されているが、テーブルvehiclecategフィールドには常に0が挿入されます。 categフィールドのタイプはtinyint(1)です。

私は何が間違っているのか分かりません。助けて?車両

CREATE TABLE IF NOT EXISTS `vehicle` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `categ` tinyint(1) NOT NULL, 
    `year` char(4) NOT NULL, 
    `make` varchar(30) NOT NULL, 
    `model` varchar(50) NOT NULL, 
    `vin` varchar(25) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `principal_driver` int(11) DEFAULT NULL, 
    `secondary_driver` varchar(30) NOT NULL, 
    `status` tinyint(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`), 
    KEY `vin` (`vin`,`user_id`) 
) ENGINE=InnoDB; 
+0

あなたは 'DESC vehicle' –

+0

@NaveenKumar問題だったもの – lovesh

+0

を行って、あなたのテーブルの出力に含まを表示することができます。 –

答えて

0

UPDATE

スキーマは、それはあなたのコードサンプル内のトリガーのいずれかが同じ名前を持っていることが正しいですか?元のコードの誤植を確認することをお勧めします。

+0

トリガー名に何か問題があった場合は、他のすべてのフィールドが入力される理由 – lovesh

1

あなたのカテゴリーは1ビットとして定義されています。「TINYINT(1)」は整数を格納するために1ビットを割り当てます。したがって、0または1しか格納できません。 (編集:私はストレージ割り当てについて間違っている、私はドキュメントを誤解した。)しかし、正直なところ、あなたが情報を「後方に」入力している理由を理解していない。あなたがヌルエントリの束を避けたい場合は、私はマスター車両テーブルに情報を入力し、車のカテゴリに特有の列を持つテーブルを分割するためのレコードをリンクします - 通常は、情報のタイプに基づいて空のフィールドを再利用しますスペースを節約してください(もし私がその情報を何度も検索するつもりでなければ)、必要なものだけを検索します。しかし、私はあなたが達成しようとしていることを知らないので、私は確かに言うことはできません。

EDIT:それはうまくいったのですか?問題がなければ、問題はありますか?ここで私はおそらく(注:完全な、またチェックされていないが):何をするのかである

 CREATE TABLE IF NOT EXISTS `logistics`.`vehicle` (
      `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT , 
      `category` TINYINT(4) NOT NULL COMMENT '(4) Allows for 7 vehicle Categories' , 
      `v_year` YEAR NOT NULL , 
      `v_make` VARCHAR(30) NOT NULL , 
      `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP , 
      `modified` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP , 
      PRIMARY KEY (`id`)) 
     ENGINE = InnoDB; 

      CREATE TABLE IF NOT EXISTS `logistics`.`driver` (
      `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT , 
      `first_name` VARCHAR(45) NOT NULL , 
      `middle_name` VARCHAR(45) NULL COMMENT 'helpful in cases of 2 drivers with the exact same first and last' , 
      `sir_name` VARCHAR(45) NOT NULL , 
      `suffix_name` VARCHAR(45) NULL COMMENT 'rather than \"pollute\" your sir name with a suffix' , 
      `license_num` VARCHAR(45) NOT NULL COMMENT 'Always handy in case of claims, reporting, and checking with the DMV, etc.' , 
      `license_expiration` DATE NOT NULL COMMENT 'Allows status of driver\'s license report to be run and alert staff of needed to verify updated license' , 
      `license_class` CHAR(1) NULL COMMENT 'From what I know classes are \'A\' through \'D\' and usually a single letter. Helpful if needing to assign drivers to vehicles.' , 
      `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
      `modified` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP , 
      PRIMARY KEY (`id`)) 
     ENGINE = InnoDB; 
      CREATE TABLE IF NOT EXISTS `logistics`.`driver_vehicle` (
      `vehicle_id` INT(11) UNSIGNED NOT NULL , 
      `driver_id` INT(11) UNSIGNED NOT NULL , 
      `principal_driver` TINYINT(1) NOT NULL DEFAULT 'FALSE' COMMENT 'if not specified it will be assumed the driver is not a primary.' , 
      `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
      `modified` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP , 
      `admin_id` INT(11) UNSIGNED NOT NULL , 
      PRIMARY KEY (`vehicle_id`, `driver_id`) , 
      INDEX `fk_driver_vehicle_driver1` (`driver_id` ASC) , 
      CONSTRAINT `fk_driver_vehicle_vehicle` 
      FOREIGN KEY (`vehicle_id`) 
      REFERENCES `mydb`.`vehicle` (`id`) 
      ON DELETE CASCADE 
      ON UPDATE CASCADE, 
      CONSTRAINT `fk_driver_vehicle_driver1` 
      FOREIGN KEY (`driver_id`) 
      REFERENCES `mydb`.`driver` (`id`) 
      ON DELETE CASCADE 
      ON UPDATE CASCADE) 
     ENGINE = InnoDB; 

     CREATE TABLE IF NOT EXISTS `logistics`.`vehicle_options` (
    `vehicle_id` INT(11) UNSIGNED NOT NULL , 
    `option_type` VARCHAR(45) NOT NULL COMMENT 'if certain options are common you could pull by type of option i.e. cosmetic, cargo, hp, weight_capacity, max_speed, etc.' , 
    `option_value` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`vehicle_id`, `option_type`) , 
    CONSTRAINT `fk_vehicle_options_vehicle1` 
    FOREIGN KEY (`vehicle_id`) 
    REFERENCES `mydb`.`vehicle` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 
+0

BTW:基本的に同じ情報を持つ2つのフィールドがあることに気付きました。もちろん、私はあなたが保険のために "プライマリ"が必要であることを理解していますが、車両に2人以上のドライバがある場合はどうなりますか?あなたは新しい列を追加することになります。ドライバーの少ない車両にはいくつかの空白があり、一部はあふれています。リレーショナルデータベースを使用することの強さは、データを正規化し、そのような問題に遭遇することはありません。 –

+0

二次ドライバのみが複数の場合があり、varcharなので、そのフィールドに区切り文字で区切られたセカンダリドライバのIDを格納します – lovesh

+0

tinyint(1)は1バイトではない – lovesh

関連する問題