全球主机交流论坛

标题: MYSQL大佬请进,(语句方面的)THANK YOU. [打印本页]

作者: 万人迷    时间: 2017-12-18 17:14
标题: MYSQL大佬请进,(语句方面的)THANK YOU.
第一问:

插入数据到A表并获取当条ID(自增)更新到B表?

A表:id,name,age(id自增)
B表:id,aid  (id自增,aid就是要获取A表ID的值)

插入:(用力

INSERT INTO A ('name','age') VALUES ('jake','35');

怎么获取A表当前条ID,并更新到B表呢?

第二问:

插入A表的时候,如果name相同怎么处理?

我是想问,如何判断name存在,如果不存在创建 ,存在就获取。



作者: leassy    时间: 2017-12-18 17:14
首先,你的字段符号搞错了,是` 不是'
第一:
INSERT INTO A (`name`,`age`) VALUES ('jake','35');
INSERT INTO B (`aid`) VALUES (LAST_INSERT_ID());
两条语句一起执行


第二:
你可以在A表建立一个name的唯一索引
作者: cdwyd    时间: 2017-12-18 17:18
如果用sql不好实现的可以考虑拆分业务逻辑,分步执行
作者: cashjay    时间: 2017-12-18 17:24
本帖最后由 cashjay 于 2017-12-18 17:32 编辑

第一问:mybatis insert 返回主键,再用返回主键update
第二问:select name from B where name = '**'  根据返回值,可以判断是否存在
作者: hdown    时间: 2017-12-18 17:35
用laravel就方便了。

B::create(['aid'=>A::findOrCreate(['name'=>'aaa'])->id]);

完事。
作者: 万人迷    时间: 2017-12-18 17:36
leassy 发表于 2017-12-18 17:28
首先,你的字段符号搞错了,是` 不是'
第一:
INSERT INTO A (`name`,`age`) VALUES ('jake','35');

厉害,第一条测试成功了,分给你了,第二条我懂,但是在不建立唯一索引的情况下怎么办呢?
作者: leassy    时间: 2017-12-18 17:37
万人迷 发表于 2017-12-18 17:36
厉害,第一条测试成功了,分给你了,第二条我懂,但是在不建立唯一索引的情况下怎么办呢? ...

事物外做查询,没有才执行前两句,一定要在事物中执行前两句
作者: 椰子    时间: 2017-12-18 17:37
1 先插 再读出来。2.你是要不能重名吗?先查,再业务逻辑。然后name设置一个唯一
作者: Eric.c    时间: 2017-12-18 17:38
楼上已说全。
逻辑还是得配合代码。。。。


作者: Eric.c    时间: 2017-12-18 17:42
Eric.c 发表于 2017-12-18 17:38
楼上已说全。
逻辑还是得配合代码。。。。


Yii2

  1. $item = A::findOne(['name'=>'VXXXXXX']);
  2. if(!$item)
  3. {
  4.         $item = New A();
  5.         $item->name='XCccccc';
  6.         if($item-save())
  7.         {
  8.                 $b = new B();
  9.                 $b->aid = $item->id;
  10.                 if($b->save())
  11.                 {
  12.                         //业务结束,全都成功
  13.                 }
  14.                 else
  15.                 {
  16.                         //插A表成功,B表失败,原因print_r($b->errors)                       
  17.                 }

  18.         }
  19.         else
  20.         {
  21.                 //插A表失败,结束
  22.         }
  23. }
复制代码


作者: 椰子    时间: 2017-12-18 17:43
本帖最后由 椰子 于 2017-12-18 17:50 编辑

insert into b  ('aid') values (select id from a where name= '名字' and age ='年龄';);
作者: caibrid    时间: 2017-12-18 17:43
本帖最后由 caibrid 于 2017-12-18 17:51 编辑

第一个应该可以用触发器解决,第二个需求可以修改下if else试下。

  1. DROP TRIGGER IF EXISTS t_afterinsert_on_a;
  2. CREATE TRIGGER t_afterinsert_on_a
  3. AFTER INSERT ON a
  4. FOR EACH ROW
  5. BEGIN
  6.      insert into b(aid) values(new.id);
  7. END;
  8. DROP TRIGGER IF EXISTS t_afterdelete_on_a;
  9. CREATE TRIGGER t_afterdelete_on_a
  10. AFTER DELETE ON a
  11. FOR EACH ROW
  12. BEGIN
  13.       delete from b where aid=old.id;
  14. END;
复制代码

作者: 万人迷    时间: 2017-12-18 17:43
leassy 发表于 2017-12-18 17:37
事物外做查询,没有才执行前两句,一定要在事物中执行前两句

INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc');
这样的话 LAST_INSERT_ID()就不启作用了
如果是多线程,也不行。。这个方便只适合一条一条的插入
作者: 万人迷    时间: 2017-12-18 17:45
Eric.c 发表于 2017-12-18 17:42
Yii2

感谢回复,亲,我要的是MYSQL语句,这个PHP类的,我不懂呀
作者: 椰子    时间: 2017-12-18 17:48
本帖最后由 椰子 于 2017-12-18 17:52 编辑
万人迷 发表于 2017-12-18 17:43
INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc');
这样的话 LAST_INSERT_ID()就不 ...


第二问就用我那个答案,或者想纯粹用sql语句  就用 case应该可以实现
作者: leassy    时间: 2017-12-18 17:49
万人迷 发表于 2017-12-18 17:43
INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc');
这样的话 LAST_INSERT_ID()就不 ...

那就做个查询
你已知那些人的姓名就能姓名做查询
INSERT INTO B (`aid`)  (SELECT `id` FROM A WHERE `name` IN ('asd','asfddfgd','asdasdadfgdfg'));
作者: janfou    时间: 2017-12-18 17:50
这么快结束了。。。。。。 分都没了
作者: Eric.c    时间: 2017-12-18 17:55
这不就是绝壁用存储过程的时候到了吗





欢迎光临 全球主机交流论坛 (https://hostloc-workers.ikyomon.com/) Powered by Discuz! X3.4