亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3911 | 回復(fù): 6
打印 上一主題 下一主題

Mysql如果不用自增長字段 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-08-02 22:51 |只看該作者 |倒序?yàn)g覽
各位好,
我現(xiàn)在有個表,想用個ID int作為主鍵,但我不想把ID作為AUTO_INCREMENT類型,因?yàn)檫@樣在數(shù)據(jù)遷移或者增刪的時候,不好控制,但這個表可能同時被多個人修改,這樣在處理插入操作的時候不太好控制,我用PHP來實(shí)現(xiàn)。

問題是比如前一個然拿到當(dāng)前的最大值加一,然后在他插入記錄以前,可能有人也拿到了這個ID并且已經(jīng)插入數(shù)據(jù)了。有什么辦法能避免這個沖突嗎?或者是有比較強(qiáng)大的SQL語句能搞定?

create table test(
  id       int NOT NULL DEFAULT 0,
  name      varchar(32)  NOT NULL DEFAULT '',
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=UTF8;

多謝

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-08-02 23:29 |只看該作者
guid

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-08-03 10:39 |只看該作者
回復(fù) 1# HappyWin

guid是個方法,如果你不要求主鍵是連續(xù)的話。
如果需要連續(xù)自增id,可以考慮由單獨(dú)一個表來存儲,只需要一列自增id,每次insert后通過getLastId得到自增的id值,由數(shù)據(jù)庫保證唯一性。

論壇徽章:
8
綜合交流區(qū)版塊每周發(fā)帖之星
日期:2015-12-02 15:03:53數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-10-02 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-10-02 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34酉雞
日期:2013-10-19 10:17:1315-16賽季CBA聯(lián)賽之北京
日期:2017-03-06 15:12:44
4 [報(bào)告]
發(fā)表于 2010-08-03 14:14 |只看該作者
自己用應(yīng)用程序來維護(hù)一個自增字段?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2010-08-03 17:06 |只看該作者
樓主的問題,可以用鎖表的辦法來解決。當(dāng)一個SESSION進(jìn)行的查詢插入的時候,鎖定表,加寫鎖。這樣其他SESSION不能寫入。
下面開始測試。
1:創(chuàng)建一個存儲過程,實(shí)現(xiàn)自增字段。

  1. create procedure sp1()
  2. begin
  3.   declare A int;
  4.   select max(id) into A from test;
  5.   insert into test values(if(A<=>null,0,A)+1,concat('a',if(A<=>null,0,A)));
  6. end ;
復(fù)制代碼
2:打開一個連接,先鎖定test 表,再進(jìn)行call sp1();

mysql> lock table test write;
Query OK, 0 rows affected (0.00 sec)

mysql> call sp1();
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | a0   |
+----+------+
1 row in set (0.00 sec)
這時候不解鎖,看另外一個連接

3:另外一個連接進(jìn)行插入操作
mysql> call sp1();
由于表被鎖,等待表釋放。。
(如果不鎖表的話,此條記錄的ID=2)

4:在第一個連接里再插入一條
mysql> call sp1();
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | a0   |
|  2 | a1   |
+----+------+
2 rows in set (0.00 sec)
插入成功,ID是2.

5:釋放鎖定。
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

6:釋放鎖的同時,3的操作成功。

mysql> call sp1();
Query OK, 1 row affected (16.17 sec)
等待了16.17秒。
再來查3操作后,寫入的是否是2

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | a0   |
|  2 | a1   |
|  3 | a2   |
+----+------+
3 rows in set (0.00 sec)

ID=3.

測試成功。
在程序調(diào)用的時候,CALL SP1前加lock table test write;執(zhí)行后加UNLOCK TABLES;

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2010-08-03 20:21 |只看該作者
多謝樓上各位的解答,非常詳細(xì),特別是909413335兄弟的回答很具體,受益匪淺,

我現(xiàn)在還是想用sql搞定,調(diào)用存儲過程會不會帶來性能問題?
如果分兩步做,先插入再用getLastId,可能拿到的是別人插入的ID,可能在我插入以后,在getLastId以前,后面又有人插入了數(shù)據(jù),會不會我拿到別人的LastId?

多謝了

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2010-08-04 09:16 |只看該作者
我現(xiàn)在還是想用sql搞定,調(diào)用存儲過程會不會帶來性能問題?

不會有性能問題。
在ID上建一個聚簇索引。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP