JBTALKS.CC

标题: [PHP + MYSQL] 高手们进来下。 [打印本页]

作者: 宅男-兜着走    时间: 2010-2-12 05:07 PM
标题: [PHP + MYSQL] 高手们进来下。
我现在有个table 是Product。

但是 Product 有个特定的 ID。

比如说, L0009 000 ~  L0009 001 ........  n

但是我要怎么才能够弄到他们在Mysql 内 AutoIncrement 呢?

我之前的做法是用 PHP 找最大的 ID 出来 然后 + 1 下去

请高手们分享下你们的做法
作者: ~Zero    时间: 2010-2-12 05:44 PM
在 mysql 那边可以 set 成 key 跟 auto-increment 的,
然后在 php 要 insert 的时候, 不要 insert 那个 key 的 value 就好了.

例如: product(ID, name, price) <-- table

  1. SQL:
  2. insert into product(name, price)
  3. values("product name", 123.45);
复制代码

[ 本帖最后由 ~Zero 于 2010-2-12 05:47 PM 编辑 ]
作者: 宅男-兜着走    时间: 2010-2-12 06:27 PM
标题: 回复 #2 ~Zero 的帖子
我的意思是  product0000  >>auto_increment 过后>>  product0001 这样的意思。 能这样的吗? 还是必须通过 php 来判断?
作者: vampcheah    时间: 2010-2-12 07:07 PM
我想问问你的 primary key 是什么?
和 productxxxxx 是不一样的吗?
作者: 宅男-兜着走    时间: 2010-2-12 07:26 PM
标题: 回复 #4 vampcheah 的帖子
int 的 auto_increment 我会。

primary key 就是 productId 就是你说的 (productxxxxx)   
他们不要号码。要的是 product00001 ,或 product00002 这样的东西。

而我的问题是什么方法能让他们自动跳。

明白我的问题吗? 抱歉, 可能我的表达能力有问题。
作者: Super-Tomato    时间: 2010-2-12 08:09 PM
原帖由 宅男-兜着走 于 2010-2-12 07:26 PM 发表
int 的 auto_increment 我会。

primary key 就是 productId 就是你说的 (productxxxxx)   
他们不要号码。要的是 product00001 ,或 product00002 这样的东西。

而我的问题是什么方法能让他们自动跳。 ...


簡單的方法就是分为兩個 column, 一個是 auto increment id 另外一個則是 prefix
這樣在 select 的時候使用 concat 与 lpad 把 prefix 和 id 结合就搞定
作者: 宅男-兜着走    时间: 2010-2-12 08:25 PM
太好了, 你了解我说的话。

== ......可是。。。老师也不要这样

你说难的方法是什么?
作者: ~Zero    时间: 2010-2-12 08:53 PM
你的 product 只有一个的吗? 还是下面的哪种?

1) A-001, A-002, B-003, B-004, A-005......
2) A-001, A-002, B-001, B-002, A-003......
3) 只有一个而已, product 001, product 002, product 003......

第一个的话, 像番茄的说法是最适合的了.
第二个的话, 单单 SQL 是做不出的, 一定要用到 PL. 就是你的方法, 用 php 找最大的来加一.
第三个的话...... 不如把 product 去掉, 用 int 就好了. = =+

正常的 database 都做不到 varchar 可以 auto-increment 的.
作者: 宅男-兜着走    时间: 2010-2-12 09:00 PM
标题: 回复 #8 ~Zero 的帖子
好啦好啦 。。。 看来只有用PHP 来+1 了
谢谢你。

第三个。

没, 因为这个他们要有的这样的ID, 我不会举例子。


然后 。。。。

问个最后一个问题, 如果 选最大的, 然后 +1 了, 再 insert 进去。

就用到两个query了,会不会影响 program 的执行速度? 还是没慢多少的其实?

[ 本帖最后由 宅男-兜着走 于 2010-2-12 09:03 PM 编辑 ]
作者: ~Zero    时间: 2010-2-12 09:57 PM
跟 database 的 auto increment 比起来当然会有差别.
一开始数据还少的时候是感觉不到的, 可是当数据多了的时候就会慢慢 feel 到了.

不然还有一个方法, 很荒谬, 可是应该可以解决你奇怪的要求, 又不会牺牲太多速度.
做一个 auto increment 的 ID, 然后利用 trigger 来 update 那个 varchar 的 ID.
也就是, 多放一个 number 的 column 在旁边, 浪费空间.

既然你的 ID 是 varchar, 可以先了解一下你是怎么 query 最大的?
作者: Super-Tomato    时间: 2010-2-12 10:19 PM
原帖由 宅男-兜着走 于 2010-2-12 08:25 PM 发表
太好了, 你了解我说的话。

== ......可是。。。老师也不要这样

你说难的方法是什么?


没有难,只是麻煩一些

建立一個 txt 檔記錄最后的 ID 数字
如目前是 L00005
那麼 txt 檔内的数字就是 5

新增一笔產品的時候就file_get_contents讀取内容之後+1即可,最後创建產品成功後再更新 txt 的数字
作者: 宅男-兜着走    时间: 2010-2-12 10:24 PM
原帖由 ~Zero 于 2010-2-12 09:57 PM 发表
跟 database 的 auto increment 比起来当然会有差别.
一开始数据还少的时候是感觉不到的, 可是当数据多了的时候就会慢慢 feel 到了.

不然还有一个方法, 很荒谬, 可是应该可以解决你奇怪的要求, 又不会牺牲太多速度.
做一个 auto increment 的 ID, 然后利用 trigger 来 update 那个 varchar 的 ID.
也就是, 多放一个 number 的 column 在旁边, 浪费空间.

既然你的 ID 是 varchar, 可以先了解一下你是怎么 query 最大的?


我想你打字应该是打太快了 == 不明白你说的最后一句是什么, 你的方法可以不过我不是很熟, 不过回复你前, 看到了 Tomato 的方法好像不错。

没有难,只是麻煩一些

建立一個 txt 檔記錄最后的 ID 数字
如目前是 L00005
那麼 txt 檔内的数字就是 5

新增一笔產品的時候就file_get_contents讀取内容之後+1即可,最後创建產品成功後再更新 txt 的数字




总之就是~ ZERO AND TOMATO save the day ~ 感谢你们。
作者: Super-Tomato    时间: 2010-2-13 02:20 AM
原帖由 ~Zero 于 2010-2-12 09:57 PM 发表
跟 database 的 auto increment 比起来当然会有差别.
一开始数据还少的时候是感觉不到的, 可是当数据多了的时候就会慢慢 feel 到了.

不然还有一个方法, 很荒谬, 可是应该可以解决你奇怪的要求, 又不会牺牲太 ...

既然你的 ID 是 varchar, 可以先了解一下你是怎么 query 最大的?


SELECT xx FROM db [conditions] ORDER BY xx DESC LIMIT 1
作者: ~Zero    时间: 2010-2-13 03:44 AM
哦对我忘记了, varchar 也是可以 order 的哈哈排写.
作者: davidbilly87    时间: 2010-2-25 02:14 AM
原帖由 宅男-兜着走 于 2010-2-12 17:07 发表
我现在有个table 是Product。

但是 Product 有个特定的 ID。

比如说, L0009 000 ~  L0009 001 ........  n

但是我要怎么才能够弄到他们在Mysql 内 AutoIncrement 呢?

我之前的做法是用 PHP 找最 ...



database just use auto increment  1,2,3 随便

$SQL = "SELECT * FROM table1";
$colum1=取出 auto increment data;

$colum1_length=strlen($colum1);
$length=5;  //00000
$for_loop= $length-$colum1_length;


for($i=0;$i< $for_loop;$i++){
   $count_zero.="0";
}
$result="Product ".$count_zero.$colum1;


// if colum1 一位数 = 1
//$count_zero = 0000
// result = Product + 0000+ 1
// answer Product 00001

// if colum1 2位数 = 22
//$count_zero = 000
// result = Product + 000+ 22
// answer Product 00022


还没跑过的,你试试看.....
作者: 宅男-兜着走    时间: 2010-2-25 02:52 AM
标题: 回复 #15 davidbilly87 的帖子
你的这个做法是每个 auto_increment 的 int id 拿出来 然后 for loop , 0 下去, 再 组 “product” 下去嘛 ==

看我的。

  1. $formatProductId = "product %05s"; // product id 的格式, format。

  2. for($i = 0 ; $i < 10000; $i++){ // 假设 10000笔资料, 然后我create 10000 笔, 0~9999
  3. printf("$formatProductId" , $i."\n"); // 用printf 的function
  4. }


复制代码

http://php.net/manual/en/function.printf.php

你这方法, 如果 人家要search data by id 的话。。。。

不过谢谢。
作者: Super-Tomato    时间: 2010-2-25 11:09 AM
原帖由 davidbilly87 于 2010-2-25 02:14 AM 发表



database just use auto increment  1,2,3 随便

$SQL = "SELECT * FROM table1";
$colum1=取出 auto increment data;

$colum1_length=strlen($colum1);
$length=5;  //00000
$for_loop= $length ...



如果你真要這么做的話,可以參考PHP手册的 str_pad 函数要方便的多
作者: davidbilly87    时间: 2010-2-25 07:55 PM
原帖由 宅男-兜着走 于 2010-2-25 02:52 发表
你的这个做法是每个 auto_increment 的 int id 拿出来 然后 for loop , 0 下去, 再 组 “product” 下去嘛 ==

看我的。

$formatProductId = "product %05s"; // product id 的格式, format。

for( ...


  你能用 array的嘛, 外面看起来是 product 0001 ,但里面是 1 而已,拿来找资料.....刚学不久嘛,不要欺负嘛
作者: davidbilly87    时间: 2010-2-25 07:57 PM
原帖由 Super-Tomato 于 2010-2-25 11:09 发表



如果你真要這么做的話,可以參考PHP手册的 str_pad 函数要方便的多


string function 不是很会,毕竟少用嘛
作者: 宅男-兜着走    时间: 2010-2-26 09:30 AM
标题: 回复 #18 davidbilly87 的帖子
哎哟~没欺负勒,我也不是什么专业的。只是做点小project罢了。
这里是论坛, 当然是讨论跟交流啊。
作者: zechs    时间: 2010-2-26 09:43 PM
依照tomato的方法,不过save进database的table里,记录最后一次的value,prefix,suffix,length。
一个table还可以用product以外的东西。
php做不知道可不可以?




欢迎光临 JBTALKS.CC (https://www.jbtalks.cc/) Powered by Discuz! X2.5