【问题标题】:SQL Query Throws Error 150SQL 查询引发错误 150
【发布时间】:2012-10-21 17:12:17
【问题描述】:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `rsmad` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `rsmad` ;

-- -----------------------------------------------------
-- Table `rsmad`.`app_flashobjects`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`app_flashobjects` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `app_id` INT UNSIGNED NOT NULL ,
  `flashobject_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `rsmad`.`app_html`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`app_html` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `app_id` INT UNSIGNED NOT NULL ,
  `html_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `rsmad`.`app_iframes`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`app_iframes` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `app_id` INT UNSIGNED NOT NULL ,
  `iframe_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `rsmad`.`app_images`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`app_images` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `app_id` INT UNSIGNED NOT NULL ,
  `image_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `rsmad`.`app_links`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`app_links` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `app_id` INT UNSIGNED NOT NULL ,
  `link_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `rsmad`.`app_text`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`app_text` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `app_id` INT UNSIGNED NOT NULL ,
  `text_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `rsmad`.`apps`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `rsmad`.`apps` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `webpage_id` INT UNSIGNED NOT NULL ,
  `timestamp` DATETIME NULL ,
  `status` ENUM('ok','malicious','good') NOT NULL DEFAULT 'ok' ,
  PRIMARY KEY (`id`) ,
  CONSTRAINT `fk_apps_app_flashobjects1`
    FOREIGN KEY (`id` )
    REFERENCES `rsmad`.`app_flashobjects` (`app_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_apps_app_html1`
    FOREIGN KEY (`id` )
    REFERENCES `rsmad`.`app_html` (`app_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_apps_app_iframes1`
    FOREIGN KEY (`id` )
    REFERENCES `rsmad`.`app_iframes` (`app_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_apps_app_images1`
    FOREIGN KEY (`id` )
    REFERENCES `rsmad`.`app_images` (`app_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_apps_app_links1`
    FOREIGN KEY (`id` )
    REFERENCES `rsmad`.`app_links` (`app_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_apps_app_text1`
    FOREIGN KEY (`id` )
    REFERENCES `rsmad`.`app_text` (`app_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

谁能解释这些查询的问题是什么?

【问题讨论】:

    标签: mysql sql foreign-keys


    【解决方案1】:

    您正在使用polymorphic associations,很遗憾,由于外键无法共享引用列,因此无法通过约束来完成。要使其正常工作,请在 apps 中为每个外部表引用它们自己的列:

    CREATE  TABLE IF NOT EXISTS `rsmad`.`apps` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
      `webpage_id` INT UNSIGNED NOT NULL ,
      `timestamp` DATETIME NULL ,
      `status` ENUM('ok','malicious','good') NOT NULL DEFAULT 'ok' ,
      `flashobjects_id` INT UNSIGNED NOT NULL,
      `html_id` INT UNSIGNED NOT NULL,
      -- etc
      PRIMARY KEY (`id`) ,
      CONSTRAINT `fk_apps_app_flashobjects1`
        FOREIGN KEY (`flashobjects_id` )
        REFERENCES `rsmad`.`app_flashobjects` (`app_id` )
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_apps_app_html1`
        FOREIGN KEY (`html_id` )
        REFERENCES `rsmad`.`app_html` (`app_id` )
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      -- etc
    

    编辑:实际上,我认为您应该反过来定义外键关系。外键在子表中定义,apps 在我看来非常像父表。现在,如果您删除任何app_% 表中的一行,与它们相关的apps 中的条目将被级联删除。

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多