Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL innoDB外键从三个表中删除级联_Php_Mysql - Fatal编程技术网

Php MySQL innoDB外键从三个表中删除级联

Php MySQL innoDB外键从三个表中删除级联,php,mysql,Php,Mysql,我有一个MySQL数据库,有几个表,与链接表相连。我的问题是DELETE语句非常复杂。因此,为了使它们更简单,我尝试使用级联删除设置外键 这是我的桌子结构 -------------- -n_size_class- -------------- -s_id - -s_name - -------------- ------------- -n_size_rows- ------------- -sr_id - -sr_name - -sr_value

我有一个MySQL数据库,有几个表,与链接表相连。我的问题是DELETE语句非常复杂。因此,为了使它们更简单,我尝试使用级联删除设置外键

这是我的桌子结构

--------------
-n_size_class-
--------------
-s_id        -
-s_name      -
--------------

-------------
-n_size_rows-
-------------
-sr_id      -
-sr_name    -
-sr_value   -
-------------

----------------
-n_size_columns-
----------------
-sc_id         -
-sc_name       -
-sc_value      -
----------------

-----------------
-n_size_row_link-
-----------------
-srl_id         -
-srl_size       -
-srl_row        -
-----------------

-----------------
-n_size_col_link-
-----------------
-scl_id         -
-scl_size       -
-scl_col        -
-----------------
其思想是n_size_类表是主要对象(一个size类),然后行和列是size类的子对象。然后使用链接表将行和列绑定到大小类。以前,我的插入工作正常,删除是个问题。现在,我尝试设置删除级联,我的插入被破坏(但我的删除工作正常)。我的目标是使插入正常工作,即插入size_类,然后对于每一行,它被插入size_行,然后也被插入size_行链接,对于列也是如此。然后,当您仅删除size_类时,所有链接、行和列也将被删除

外键/级联这些表的正确方式是什么?现在,当我尝试向列或行表中插入任何内容时,会出现外键约束错误

根据请求,创建语句:

CREATE TABLE `n_size_class` (
  `s_id` int(11) NOT NULL auto_increment,
  `s_name` text NOT NULL,
  PRIMARY KEY  (`s_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE `n_size_columns` (
  `sc_id` int(11) NOT NULL auto_increment,
  `sc_name` text NOT NULL,
  `sc_value` text NOT NULL,
  PRIMARY KEY  (`sc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE `n_size_rows` (
  `sr_id` int(11) NOT NULL auto_increment,
  `sr_name` text NOT NULL,
  `sr_value` text NOT NULL,
  PRIMARY KEY  (`sr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE `n_size_row_link` (
  `srl_id` int(11) NOT NULL auto_increment,
  `srl_size` int(11) NOT NULL,
  `srl_row` int(11) NOT NULL,
  PRIMARY KEY  (`srl_id`),
  KEY `srl_row` (`srl_row`),
  KEY `srl_size` (`srl_size`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE `n_size_col_link` (
  `scl_id` int(11) NOT NULL auto_increment,
  `scl_size` int(11) NOT NULL,
  `scl_col` int(11) NOT NULL,
  PRIMARY KEY  (`scl_id`),
  KEY `scl_col` (`scl_col`),
  KEY `scl_size` (`scl_size`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

在我看来,有3个对象在发挥作用:大小、行和列

我假设:

  • 这是因为可以为许多行/列分配一个大小,并且行/列可以有许多大小
  • 删除尺寸时,应删除指定,而不删除行/列本身
  • 删除行/列时,应删除指定,而不是大小本身
因此:

创建表格大小(
大小\u id整数无符号自动\u增量,
大小\名称VARCHAR(255),
...
主键(大小\u id)
);
创建表行(
行id整数无符号自动增量,
...
主键(行id)
);
创建表列(
列id整数无符号自动增量,
...
主键(列id)
);
创建表格行大小(
行id为无符号整数,
大小\u id整数无符号,
主键(行id、大小id),
约束外键l_row_size-row_id(row_id)在删除级联上引用更新级联上的行(row_id),
约束外键l_row_size-size_id(size_id)在删除级联上引用更新级联上的大小(size_id)
);
创建表格l\u列大小(
列id整数无符号,
大小\u id整数无符号,
主键(列id、大小id),
约束外键l_col_size-row_id(col_id)在删除级联上引用更新级联上的行(col_id),
约束外键l_col_size-size_id(size_id)在删除级联上的更新级联上引用大小(size_id)
);
然后:


编辑 沙夫评论说:

每个尺寸类可以有许多行和许多列,但每个行和列只能属于一个尺寸类

那么您只需要3张桌子:

创建表格大小(
大小\u id整数无符号自动\u增量,
...
主键(大小\u id)
);
创建表行(
行id整数无符号自动增量,
大小\u id整数无符号,
...
主键(行id)
约束外键行-size\u id(size\u id)在删除级联上引用更新级联上的大小(size\u id),
);
创建表列(
列id整数无符号自动增量,
大小\u id整数无符号,
...
主键(col_id),
约束外键cols-size_id(size_id)在删除级联上的更新级联上引用大小(size_id),
);

链接表只有在n:m关系的情况下才真正有用,这是两个1:n关系的情况。每个行/列对象只需存储对其所属大小的引用。

请为3个表提供
CREATE
语法。它的工作方式不太一样。每个大小类可以有许多行和许多列,但每一行和每一列只能属于一个大小类。我可能最终会切换到该大小类,但我仍然想知道如何正确设置外键。@sharf将其视为父子关系。父表独立于子表运行。子表定义一个外键约束以“附加”到父表中的引用键。当更新/删除子级中的行时,父级不会发生任何变化。更新/删除父表中的行时,更改将根据外键设置的更新/删除时的
规则传播到子表。我给出的原始表集或多或少地与您定义的5个表匹配,它们的外键也一样。这个模式会起作用,但它不必要地复杂。我理解这一点,但我似乎无法让它起作用。我尝试使链接表成为size类表的子表,并使行/列表成为链接表的子表。不幸的是,这在插入行/列表时导致了错误。在不久的将来,这个功能可能会有扩展,这就是为什么我希望保持链接表分开的原因。@sharf请考虑一下这种关系。当尺寸表发生更改时,应向下链接到链接表,然后向下链接到行/列表。因此,行/列表应具有引用其链接表的FK,而链接表应具有引用大小表的FK。
foreach( $sizes as $size ) {
  $dbh->query("INSERT INTO sizes (size_name) VALUES ('{$size['name']}')");
  $size_id = $dbh->last_insert_id();

  foreach( $rows as $row ) {
    $dbh->query("INSERT INTO l_row_size (size_id, row_id) VALUES ($size_id, {$row['id']})");
  }

  foreach( $cols as $col ) {
    $dbh->query("INSERT INTO l_col_size (size_id, col_id) VALUES ($size_id, {$col['id']})");
  }
}