2012-02-14 4 views
1

Мое приложение требует 5 различных категорий транспортных средств, и каждая категория транспортного средства имеет некоторые общие поля. Итак, что я сделал, было создано 5 таблиц для каждой из 5 категорий транспортных средств vehicle1, vehicle2, vehicle3, vehicle4, vehicle5 , а затем создано шестое стол «транспортное средство» для хранения полей, которые являются общими для каждого транспортного средства. Теперь всякий раз, когда я ввожу информацию, относящуюся к определенному транспортному средству, которое представляет собой таблицу категорий конкретного транспортного средства, запускается триггер, который вставляет общие поля в таблицу 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 но для поля categ в таблице vehicle всегда вставлен столбец 0. тип поля categ: tinyint(1).

Я не понимаю, что случилось. Помогите?

UPDATE

схема транспортного средства

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

вы можете показать вывод вашей таблицы 'убывание vehicle' –

+0

@NaveenKumar сделало – lovesh

+0

, что была проблема. –

ответ

0

Верно ли, что любой из триггеров в вашем примере кода имеют такое же имя? Я бы предложил проверить наличие опечаток в исходном коде.

+0

если что-то не так с именем триггера, то почему все остальные поля будут введены. – lovesh

1

Ваша категория определяется как один бит: «TINYINT (1)» выделяет 1 бит для хранения целого числа. Таким образом, вы можете хранить только 0 или 1. (EDIT: я ошибаюсь в распределении памяти, я неправильно понял документацию.) Но я честно не понимаю, почему вы вводите информацию «назад». Я бы ввел информацию в таблицу основных транспортных средств, а затем связал записи, чтобы разбить таблицы со столбцами, относящимися к категории транспортных средств, если вы хотите избежать пустых нулевых записей. Обычно я просто перенаправляю пустые поля на основе типа информации для сэкономить место (если я не буду искать эту информацию много, если вообще) и только получить то, что мне нужно. Но я не знаю, чего вы пытаетесь достичь, поэтому я не могу сказать наверняка.

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 поля с по существу той же информацией: первичный и вторичный драйвер. Конечно, я понимаю, что вам нужен «первичный» для страхования, но что, если на автомобиле есть более двух водителей? Вы в конечном итоге добавляете новые столбцы, а некоторые пустые для автомобилей с меньшим количеством драйверов, а некоторые переполняются. Сила использования реляционной базы данных позволяет нормализовать данные и никогда не сталкиваться с такой проблемой. –

+0

только вторичный драйвер может быть кратным, поэтому он является varchar, поэтому я буду хранить идентификаторы вторичных драйверов в этом поле, разделенные разделителем – lovesh

+0

tinyint (1) принимает 1 байт не бит – lovesh

Смежные вопросы