如何保证两个表的数据能正确插入?既在插入第二个表的时候能正确插入。

czb 2002-10-09 04:26:29
如下面的两个表,studentdetails表的id与student的id要求相同。在插入student表之后,如何取得student表中id的值,接着插入studentdetails表?如果有多个人同时进行插入操作,应如何处理?谢谢。
mysql> desc student;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| name | varchar(12) | YES | | NULL | |
| gender | char(2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

mysql> desc studentdetails;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| id | int(11) | | PRI | 0 | |
| address | varchar(255) | YES | | NULL | |
| postcode | varchar(9) | YES | | NULL | |
| hometel | varchar(16) | YES | | NULL | |
| email | varchar(32) | YES | | NULL | |
| parentname | varchar(12) | YES | | NULL | |
| photo | longblob | YES | | NULL | |
| createdate | datetime | YES | | NULL | |
| lastupdate | timestamp(14) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
9 rows in set (0.11 sec)
...全文
80 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
czb 2002-10-13
  • 打赏
  • 举报
回复
谢谢楼上的两位老兄,特别是热心的shuixin13(犬犬(心帆))
shuixin13 2002-10-11
  • 打赏
  • 举报
回复
给你一断代码,不过你要有TMySQL.Components for Delphi控件,
URL: http://www.inprises.com/control/TMySQL.Components.v2001.1.0.0.For.Delphi.And.Kylix.Incl.Full.Source-DiSTiNCT.rar
====================================================================
{本程序已实现了图像从mysql数据库存入和读出
作者:刘志强
image表:
code char 10
image longblob (*如换成blob则存储很慢)
}
unit Unit119;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, MySQLDataset, Grids, DBGrids, MySQLServer, StdCtrls, DBCtrls;

type
TForm1 = class(TForm)
MySQLServer1: TMySQLServer;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
MySQLQuery1: TMySQLQuery;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: PChar;
fd: Integer;
Stream: TMySQLBlobStream;
bmp:TBitmap;
flen:Int64;
begin
bmp:=TBitmap.Create;
try
//向Mysql表写入Bmp图像
bmp.LoadFromFile('c:\program files\common files\borland shared\Images\Splash\256color\factory.bmp');
MySQLQuery1.Open;
MySQLQuery1.Append;
MySQLQuery1.FieldByName('code').AsString:='刘志12';
MySQLQuery1.FieldbyName('image').Assign(bmp);
MySQLQuery1.TableName:='image';
MySQLQuery1.post;


//从Mysql表读出Bmp图像
MySQLQuery1.close;
MySQLQuery1.SQl.Clear;
MySQLQuery1.SQL.Add('select * from image where code="刘志12"');
MySQLQuery1.Open;

MySQLQuery1.Next;
MySQLQuery1.Edit;
Stream := TMySQLBlobStream.Create(MySQLQuery1.FieldByName('Image') as TBlobField, bmReadWrite);
bmp.LoadFromStream(stream);
canvas.Draw(0,0,bmp);
finally
Stream.Free;
bmp.Free;
end;
end;


end.
czb 2002-10-11
  • 打赏
  • 举报
回复
shuixin13(犬犬(心帆)) :老大,再向你请教一个问题,我在studentdetails表里有一个longblob型字段photo用来存储相片的,该如何用SQL插入,能用SQL插入吗?如果不能,请教该如何处理呢?
shuixin13 2002-10-10
  • 打赏
  • 举报
回复
呵呵,当然了,
只要你在
INSERT INTO student VALUES(null, 'name1', 'gender1', '2002-06-06');
后没有再向student插入新的信息,而是直接运行

INSERT INTO studentdetails VALUES(last_insert_id(), 'address1','postcode1','hometel1','email','parentname1',null,null,null);
czb 2002-10-09
  • 打赏
  • 举报
回复
shuixin13(犬犬(心帆)):
“它取出的就是你上一条INSERT语句插入的自增值,它并不会因别的用户插入新的记录而改变的,”
如果我写一个多线程的程序,不断向student表插入数据,然后再 SELECT Last_Insert_Id(); ,再向studentdetail表插入数据,能保证id的正确性吗?

yu_dx():
“所有的mysql_query()都要加上判断”能说说怎么判断吗?“为数据库解锁”是不是运行 mysql_query("unlock tables"); 就得了?我是初学者,不好意思。

yu_dx 2002-10-09
  • 打赏
  • 举报
回复
建议你在INSERT是使用lock
---------------------------------
mysql_query("lock tables student write");
//insert into student ............
//select Last_insert_id();or select max(id) from student;
//insert into studentdetail ..............
mysql_query("unlock tables");
----------------------------------
记住,所有的mysql_query()都要加上判断,如果你要终止,一定要为数据库解锁
shuixin13 2002-10-09
  • 打赏
  • 举报
回复
SELECT Last_Insert_Id();

只要你向student 插入一条新信息,
然后再运行它
它取出的就是你上一条INSERT语句插入的自增值,
它并不会因别的用户插入新的记录而改变的,
shuixin13 2002-10-09
  • 打赏
  • 举报
回复
INSERT INTO student VALUES(null, 'name1', 'gender1', '2002-06-06');
INSERT INTO studentdetails VALUES(last_insert_id(), 'address1','postcode1','hometel1','email','parentname1',null,null,null);

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧