关于MYSQL的,高手请进帮帮我吧。。急。。。在线等。

时间:2023-01-06 14:10:15
我是新手,对数据库懂的不多。。有个问题不清楚  
如下:  
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表中的数据。
所以我就必须,确保在写入数据的时候,两个表中的数据保持同步。

#3


将一条数据插入表X和表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个问题的回答。

我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。

#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 = ....//根据需求自己设置

#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.",***) ");

#8


谢谢先生赐教

#1


先把意图说一下吧,我觉得你想问的是表之间引用一致性的问题,根据你具体的意图才能写出合适的代码。

#2


对对,我想问的就是“表之间引用一致性的问题”。。。
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的感受

#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个问题的回答。

我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。

#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 = ....//根据需求自己设置

#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.",***) ");

#8


谢谢先生赐教