триггер mysql частично работает - PullRequest
1 голос
/ 14 февраля 2012

Мое приложение требует 5 различных категорий транспортных средств, и у каждой категории транспортных средств есть несколько общих полей. Итак, что я сделал, было создано 5 таблиц для каждой из 5 категорий транспортных средств vehicle1, vehicle2, vehicle3, vehicle4, vehicle5 и затем создал шестую таблицу «транспортное средство» для хранения полей, которые являются общими для каждого транспортного средства. Теперь, когда я вводю информацию, относящуюся к конкретному транспортному средству, которая является INSERT INTO таблицей категорий этого конкретного транспортного средства, запускается триггер, который вставляет общие поля в таблицу vehicle. так что триггеры выглядят так

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;

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

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

РЕДАКТИРОВАТЬ: Это сработало, и если нет, какие проблемы у вас возникли? Вот что я, вероятно, сделал бы (примечание: не завершено и не проверено):

        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 голосов
/ 14 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...