如下:
MySQL数据库
我有表A,B,C,D(结构一样,主键name int,外键id int{映射X表的主键id},类别type int),有表X(结构为主键id int auto_increment,合计 total int)
请问,A,B,C,D(以A为例就好),X的创建的sql语句如何写?
我要将一条数据插入表X和表A,sql语句怎么写?
我要对表X中的total字段进行更新,sql语句怎么写?
8 个解决方案
#1
先把意图说一下吧,我觉得你想问的是表之间引用一致性的问题,根据你具体的意图才能写出合适的代码。
#2
对对,我想问的就是“表之间引用一致性的问题”。。。
X中有的每一行数据都是唯一的,而且都与A,B,C,D表中的一个表的一条数据发生唯一的映射,也就是说X表有1000条数据,那么A,B,C,D(数据总合也就为1000)。
我想做这样的查询,就是通过A,B,C,D表中的外键,来查询X表中的数据。
所以我就必须,确保在写入数据的时候,两个表中的数据保持同步。
X中有的每一行数据都是唯一的,而且都与A,B,C,D表中的一个表的一条数据发生唯一的映射,也就是说X表有1000条数据,那么A,B,C,D(数据总合也就为1000)。
我想做这样的查询,就是通过A,B,C,D表中的外键,来查询X表中的数据。
所以我就必须,确保在写入数据的时候,两个表中的数据保持同步。
#3
将一条数据插入表X和表A:
把插入表X的sql写在插入表A前面就行了
对表X中的total字段进行更新:
只管更新就行了,不考虑A的感受
把插入表X的sql写在插入表A前面就行了
对表X中的total字段进行更新:
只管更新就行了,不考虑A的感受
#4
首先,引用一致性只在innoDB类型的表上起作用,在MyISAM类型的表上不起作用,所以确定你的表类型是innoDB。
然后可以这样创建表,其实主要区别是在外键表上,而不是主键表上,所以X的创建和以往是一样的,不具体写了,大致如下:
创建表X
create table x
(
id int not null auto_increment,
total int not null,
primary key ( id ),
)
engine = innoDB
default charset = ....//根据需求自己设置
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
这样,在你删除或者修改表X的内容时,表A也会跟着做相应改变,用以保证表间数据的一致性,但是修改表A,并不影响表X。
因为引用一致性只关心修改和删除操作,并不对插入操作有任何作用,想一想也知道,表X插入一个数据,表A不会自动跟着插入,因为其他字段是不确定的,所以在插入数据时,需要人为的进行一致性插入,和正常的写法一样,这也就是对于你第2个问题的回答。
更新X表的total字段,也不影响A表的数据,所以更新的sql语句也可以正常写 updata...set....,这是对第3个问题的回答。
我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。
然后可以这样创建表,其实主要区别是在外键表上,而不是主键表上,所以X的创建和以往是一样的,不具体写了,大致如下:
创建表X
create table x
(
id int not null auto_increment,
total int not null,
primary key ( id ),
)
engine = innoDB
default charset = ....//根据需求自己设置
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
这样,在你删除或者修改表X的内容时,表A也会跟着做相应改变,用以保证表间数据的一致性,但是修改表A,并不影响表X。
因为引用一致性只关心修改和删除操作,并不对插入操作有任何作用,想一想也知道,表X插入一个数据,表A不会自动跟着插入,因为其他字段是不确定的,所以在插入数据时,需要人为的进行一致性插入,和正常的写法一样,这也就是对于你第2个问题的回答。
更新X表的total字段,也不影响A表的数据,所以更新的sql语句也可以正常写 updata...set....,这是对第3个问题的回答。
我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。
#5
创建表A改一下,写漏了
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
engine = innoDB
default charset = ....//根据需求自己设置
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
engine = innoDB
default charset = ....//根据需求自己设置
#6
关键是我在向x表插入数据的时候,我不知道我插入的这条数据的id是多少啊。。我怎么样可以做到在插入x表后,再从x表中拿到刚刚插入的数据的id,然后再和其他数据放在一起插入表A 呢?
实在不好意思。我是真的新手。。。,希望先生再指教一下。。
实在不好意思。我是真的新手。。。,希望先生再指教一下。。
#7
用mysql_insert_id()可以获得上一次插入操作所产生的id;
大概是这样
mysql_query( "insert into x....");
$last_id = mysql_insert_id();
mysql_query("insert into a (name,id ,type) values (***,".$last_id.",***) ");
大概是这样
mysql_query( "insert into x....");
$last_id = mysql_insert_id();
mysql_query("insert into a (name,id ,type) values (***,".$last_id.",***) ");
#8
谢谢先生赐教
#1
先把意图说一下吧,我觉得你想问的是表之间引用一致性的问题,根据你具体的意图才能写出合适的代码。
#2
对对,我想问的就是“表之间引用一致性的问题”。。。
X中有的每一行数据都是唯一的,而且都与A,B,C,D表中的一个表的一条数据发生唯一的映射,也就是说X表有1000条数据,那么A,B,C,D(数据总合也就为1000)。
我想做这样的查询,就是通过A,B,C,D表中的外键,来查询X表中的数据。
所以我就必须,确保在写入数据的时候,两个表中的数据保持同步。
X中有的每一行数据都是唯一的,而且都与A,B,C,D表中的一个表的一条数据发生唯一的映射,也就是说X表有1000条数据,那么A,B,C,D(数据总合也就为1000)。
我想做这样的查询,就是通过A,B,C,D表中的外键,来查询X表中的数据。
所以我就必须,确保在写入数据的时候,两个表中的数据保持同步。
#3
将一条数据插入表X和表A:
把插入表X的sql写在插入表A前面就行了
对表X中的total字段进行更新:
只管更新就行了,不考虑A的感受
把插入表X的sql写在插入表A前面就行了
对表X中的total字段进行更新:
只管更新就行了,不考虑A的感受
#4
首先,引用一致性只在innoDB类型的表上起作用,在MyISAM类型的表上不起作用,所以确定你的表类型是innoDB。
然后可以这样创建表,其实主要区别是在外键表上,而不是主键表上,所以X的创建和以往是一样的,不具体写了,大致如下:
创建表X
create table x
(
id int not null auto_increment,
total int not null,
primary key ( id ),
)
engine = innoDB
default charset = ....//根据需求自己设置
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
这样,在你删除或者修改表X的内容时,表A也会跟着做相应改变,用以保证表间数据的一致性,但是修改表A,并不影响表X。
因为引用一致性只关心修改和删除操作,并不对插入操作有任何作用,想一想也知道,表X插入一个数据,表A不会自动跟着插入,因为其他字段是不确定的,所以在插入数据时,需要人为的进行一致性插入,和正常的写法一样,这也就是对于你第2个问题的回答。
更新X表的total字段,也不影响A表的数据,所以更新的sql语句也可以正常写 updata...set....,这是对第3个问题的回答。
我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。
然后可以这样创建表,其实主要区别是在外键表上,而不是主键表上,所以X的创建和以往是一样的,不具体写了,大致如下:
创建表X
create table x
(
id int not null auto_increment,
total int not null,
primary key ( id ),
)
engine = innoDB
default charset = ....//根据需求自己设置
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
这样,在你删除或者修改表X的内容时,表A也会跟着做相应改变,用以保证表间数据的一致性,但是修改表A,并不影响表X。
因为引用一致性只关心修改和删除操作,并不对插入操作有任何作用,想一想也知道,表X插入一个数据,表A不会自动跟着插入,因为其他字段是不确定的,所以在插入数据时,需要人为的进行一致性插入,和正常的写法一样,这也就是对于你第2个问题的回答。
更新X表的total字段,也不影响A表的数据,所以更新的sql语句也可以正常写 updata...set....,这是对第3个问题的回答。
我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。
#5
创建表A改一下,写漏了
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
engine = innoDB
default charset = ....//根据需求自己设置
创建表A
create talbe a
(
name int not null,
id int not null,
type int not null,
primary key( name ),
foreign key (id) references x (id) on delete cascade on update cascade
)
engine = innoDB
default charset = ....//根据需求自己设置
#6
关键是我在向x表插入数据的时候,我不知道我插入的这条数据的id是多少啊。。我怎么样可以做到在插入x表后,再从x表中拿到刚刚插入的数据的id,然后再和其他数据放在一起插入表A 呢?
实在不好意思。我是真的新手。。。,希望先生再指教一下。。
实在不好意思。我是真的新手。。。,希望先生再指教一下。。
#7
用mysql_insert_id()可以获得上一次插入操作所产生的id;
大概是这样
mysql_query( "insert into x....");
$last_id = mysql_insert_id();
mysql_query("insert into a (name,id ,type) values (***,".$last_id.",***) ");
大概是这样
mysql_query( "insert into x....");
$last_id = mysql_insert_id();
mysql_query("insert into a (name,id ,type) values (***,".$last_id.",***) ");
#8
谢谢先生赐教