|
查看: 1364|回复: 23
|
要怎样写这个php的statement出来?
[复制链接]
|
|
|
要怎样写这个的statement出来呢?在MySQL里面没有record就加,如果有和NULL记录就UPDATE NULL记录。但是加之前要检查日期确保不会duplicate。这个是我现在的if else statement- if (!empty($theData[0]['0']) || !empty($theData[0]['1']) || !empty($theData[0]['2'])) {
- $sql_m = "INSERT INTO m (date, first, second, third) VALUE(
- '$newDate',
- '" . $theData[0]['0'] . "' ,
- '" . $theData[0]['1'] . "' ,
- '" . $theData[0]['2'] . "')";
复制代码 本帖最后由 just4why 于 20-6-2013 05:12 PM 编辑
|
|
|
|
|
|
|
|
|
|
|
发表于 20-6-2013 06:21 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 08:42 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 21-6-2013 09:32 AM
|
显示全部楼层
andy5627 发表于 20-6-2013 06:21 PM 
把table里的date设成unique就可以。
什么是UNIQUE呢?在table设成还要些什么的code呢?
|
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 21-6-2013 10:49 AM
|
显示全部楼层
geekman 发表于 21-6-2013 08:42 AM 
ON DUPLICATE KEY UPDATE
怎样只是update NULL record呢?
|
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 12:02 PM
|
显示全部楼层
just4why 发表于 21-6-2013 10:49 AM 
怎样只是update NULL record呢?
你的Row必须设定一个Unique Key。你总不能INSERT一个完全NULL的Record吧?那是很不好的习惯。
Unique Key可以是一个Auto Increment的column,或者任何一个不会重复的column,或者数个column的组合,每个组合都必须是Unique的数值。例如如果你要keep track一个member每年的记录,你可以把 record_year和member_id组合成一个Unique Key,每一年每个member都可以有一个record,但是又不会触发Duplicate Key。
|
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 21-6-2013 12:14 PM
|
显示全部楼层
geekman 发表于 21-6-2013 12:02 PM 
你的Row必须设定一个Unique Key。你总不能INSERT一个完全NULL的Record吧?那是很不好的习惯。
Unique ...
如果我有5个records但是1一个和第3个是NULL,那我要怎样UPDATE 1和3呢?我就不想真个row update- ON DUPLICATE KEY UPDATE
- a_first = '" . $theData[0]['0'] ."' ,
- a_second = '" . $theData[0]['1'] ."'";
复制代码 |
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 12:28 PM
|
显示全部楼层
你要弄清楚,在SQL里面一般上Row指的就是一个record,而每个Record的各个项目,都被称为Column,或者Field(ODBC 的 user 会比较习惯 Field 这个名称)。
如果你要check的是某个Row里面的某个Column是NULL那你可以使用这个方法:
- /// $result = result of query
- $row = mysqli_fetch_array($result);
- if($row[column_1] == NULL)
- {
- /// do update 1
- }
- if($row[column_2] == NULL)
- {
- /// do update 2
- }
- ...
- if($row[column_n] == NULL)
- {
- /// do update N
- }
复制代码 本帖最后由 geekman 于 21-6-2013 12:36 PM 编辑
|
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 21-6-2013 12:32 PM
|
显示全部楼层
geekman 发表于 21-6-2013 12:28 PM 
你要弄清楚,在SQL里面一般上Row指的就是一个record,而每个Record的各个项目,都被称为Column,或者Field( ...
如果我有20个colum那不是要做很多if else?
|
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 12:34 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 21-6-2013 12:44 PM
|
显示全部楼层
geekman 发表于 21-6-2013 12:34 PM 
如果是PHP的方式,是的。如果你要的是SQL Statement,可以参考这个:http://thewebfellas.com/blog/2010/1/ ...
那我这个sql query要怎样加才可以呢?刚才试了你给的demo还是不行- if (!empty($my[0]['0']) || !empty($my[0]['1']) || !empty($my[0]['2'])) {
- $sql_m = "INSERT INTO m (abc_date, abc_first, abc_second, abc_third, abc_kl_1, abc_kl_2, abc_kl_3, abc_kl_4, abc_kl_5, abc_kl_6, abc_kl_7, abc_kl_8, abc_kl_9, abc_kl_10, abc_pg_1, abc_pg_2, abc_pg_3, abc_pg_4, abc_pg_5) VALUE(
- '$newDate',
- '" . $my[0]['0'] . "' , '" . $my[0]['1'] . "' , '" . $my[0]['2'] . "' ,
- '" . $my[0]['3'] . "' , '" . $my[0]['4'] . "' , '" . $my[0]['5'] . "' ,
- '" . $my[0]['6'] . "' , '" . $my[0]['7'] . "' , '" . $my[0]['8'] . "' ,
- '" . $my[0]['9'] . "' , '" . $my[0]['10'] . "' , '" . $my[0]['11'] . "' ,
- '" . $my[0]['12'] . "' , '" . $my[0]['13'] . "')
- ON DUPLICATE KEY UPDATE
- abc_first = '" . $my[0]['0'] . "' , abc_second = '" . $my[0]['1'] . "' , abc_third = '" . $my[0]['2'] . "' ,
- abc_kl_1 = '" . $my[0]['3'] . "' , abc_kl_2 = '" . $my[0]['4'] . "' , abc_kl_3 = '" . $my[0]['5'] . "' ,
- abc_kl_4 = '" . $my[0]['6'] . "' , abc_kl_5 = '" . $my[0]['7'] . "' , abc_kl_6 = '" . $my[0]['8'] . "' ,
- abc_kl_7 = '" . $my[0]['9'] . "' , abc_kl_8 = '" . $my[0]['10'] . "' , abc_kl_9 = '" . $my[0]['11'] . "' ,
- abc_kl_10 = '" . $my[0]['12'] . "' , abc_pg_1 = '" . $my[0]['13'] . "' , abc_pg_2 = '" . $my[0]['14'] . "' ,
- abc_pg_3 = '" . $my[0]['15'] . "' , abc_pg_4 = '" . $my[0]['16'] . "' , abc_pg_5 = '" .";
- mysql_query($sql_m) or die("Fatal error: " . mysql_error());
- }
复制代码 |
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 01:04 PM
|
显示全部楼层
如果你觉得ON DUPLICATE KEY UPDATE 有点难理解,我个人是建议自行检测:
注意我用的是 mysqli_ , 不是 mysql_ 。mysql_ 已经是被淘汰的旧Function了。
- $query = "SELECT * FROM m WHERE abc_date = " . $date;
- $result = mysqli_query($con, $query) or die(mysqli_error($con));
- if(mysqli_num_rows($result) < 1) /// No record exists
- {
- //// Insert record as usual
- $query = "INSERT INTO m ...blah blah blah...";
- }
- else /// record exists
- {
- $row = mysqli_fetch_array($result);
- /// check columns value, update if it is NULL, don't update if not NULL
- $query = "UPDATE m SET(abc_date = " . $row['abc_date'] . ",";
- if($row['abc_first'] == NULL)
- {
- $query .= "abc_first = '" . new_value . "',";
- }
- ....
- $query .= " WHERE abc_date = " . $date . ";";
- }
- mysqli_query($con, $query) or die(mysqli_error($con));
复制代码 本帖最后由 geekman 于 21-6-2013 01:08 PM 编辑
|
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 21-6-2013 03:04 PM
|
显示全部楼层
geekman 发表于 21-6-2013 01:04 PM 
如果你觉得ON DUPLICATE KEY UPDATE 有点难理解,我个人是建议自行检测:
注意我用的是 mysqli_ , 不是 m ...
如果在ON DUPLICATE KEY UPDATE要怎样做呢?下面if 的statement是拿来做validation,就是当1 2 3的东西在他就输入record。输入了record再检查那个column是null的。刚才你的code也是不能update null,为什么呢 Fatal error: Duplicate entry '2013-06-16' for key 'm_date'- if (!empty($my[0]['0']) || !empty($my[0]['1']) || !empty($my[0]['2'])) {
- .........
- };
复制代码 本帖最后由 just4why 于 21-6-2013 03:38 PM 编辑
|
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 04:17 PM
|
显示全部楼层
我不明白你说的不能Updagte NULL是什么意思。
有时Empty Filed并不一定是NULL,也可以是Empty String(For String type column),也就是“”,所以你也要Check这个可能性,还有,Numeric column也不能Check against NULL,因为NULL就是0,如果那个column的内容正好是0,也会出现问题。
Duplicate entry '2013-06-16' for key 'm_date' 是因为你把m_date设定为UNIQUE,而你尝试再INSERT一个相同的日期。 |
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2013 06:12 PM
|
显示全部楼层
$query = "SELECT * FROM m WHERE abc_date = " . $date;
你查一查是date format 的問題嗎. |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 24-6-2013 12:16 PM
|
显示全部楼层
yan13 发表于 21-6-2013 06:12 PM 
$query = "SELECT * FROM m WHERE abc_date = " . $date;
你查一查是date format 的問題嗎.
拿到的info是 SELECT * FROM m where abc_date =2013-06-23
|
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 24-6-2013 12:19 PM
|
显示全部楼层
geekman 发表于 21-6-2013 04:17 PM 
我不明白你说的不能Updagte NULL是什么意思。
有时Empty Filed并不一定是NULL,也可以是Empty String(F ...
现在就是UPDATE了之后,就检查有NULL record,如果有就update null record,如果不能update 就skip。之后我会做一个cron job来run他
|
|
|
|
|
|
|
|
|
|
|
发表于 24-6-2013 01:41 PM
|
显示全部楼层
Fatal error: Duplicate entry '2013-06-16' for key 'm_date'
你是run了那一段code出的error?現在還有嗎?
|
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 24-6-2013 01:49 PM
|
显示全部楼层
yan13 发表于 24-6-2013 01:41 PM 
Fatal error: Duplicate entry '2013-06-16' for key 'm_date'
你是run了那一段code出的error?現在還有嗎? ...
因为我使用Unique key所以有duplicate的资料就会出现
|
|
|
|
|
|
|
|
|
|
|
发表于 24-6-2013 02:04 PM
|
显示全部楼层
if(mysqli_num_rows($result) < 1) /// No record exists
geekman給你的例子有checking的,如果record存在就update,沒的話才insert. |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|