FOREIGN KEY约束建议

时间:2014-05-20 23:48:17

标签: sql

我的问题是,为了更新我的数据库,每次我因为约束键而希望更新时,我必须重新选择我的时区下拉框。

我正在处理两张桌子......

City表约束外键约束,即IDTimeZone

time_zone表包含主键IDTimeZone

我想弄清楚怎么做基本上我的插件不依赖于用户是否选择了时区来更新该目的地。不幸的是,我无法控制IDTimeZone是否是一个约束。

// city timezone
$time_zone = isset($_POST['tz']) ? $_POST['tz'] : 0;
if ($time_zone <> 0) {
$errorcode = 0;
$strmsg = "";
$sql="SELECT * from time_zone ORDER BY NAME;";
$result=mysql_query($sql);
$cont=mysql_num_rows($result);
if(mysql_num_rows($result)){
    $chtml = '<select name="tz" id="tz"><option value="0">--Select time zone--   </option>';
    while($row = mysql_fetch_array($result)){
        $chtml .= '<option value="'.$row['IDTimeZone'].'">'.$row['name'].'</option>';
    }
    $chtml .= '</select>';
    echo json_encode(array("errorcode"=>$errorcode,"chtml"=>$chtml));
}else{
    $errorcode = 1;
    $strmsg = '<font style="color:#F00;">No States available</font>';
    echo json_encode(array("errorcode"=>$errorcode,"chtml"=>$strmsg));
}
}

这是我的更新代码...

$SQL = "UPDATE city SET description='$description',page_title='$pagetitle',page_tags='$metakey', page_description_tag='$metadescription',
    is_active='$active',population='$pop', county='$county', IDTimeZone='$tz', elevation='$ele', peak_season='$ps', /* sunrise*/ srise_jan='$srjan',srise_feb='$srfeb',srise_mar='$srmarch',srise_apr='$srapril',srise_may='$srmay',srise_jun='$srjune',
    srise_jul='$srjuly', srise_aug='$sraug', srise_sep='$srsept', srise_oct='$sroct', srise_nov='$srnov', srise_dec='$srdec',/*Sun Set */ sset_jan='$ssjan',
    sset_feb='$ssfeb',sset_mar='$ssmarch',sset_apr='$ssapril',sset_may='$ssmay',sset_jun='$ssjune', sset_jul='$ssjuly', sset_aug='$ssaug',
    sset_sep='$sssept', sset_oct='$ssoct', sset_nov='$ssnov', sset_dec='$ssdec',/*Temp*/temp_jan='$tjan',temp_feb='$tfeb',temp_mar='$tmarch',temp_apr='$tapril',temp_may='$tmay',temp_jun='$tjune',
    temp_jul='$tjuly', temp_aug='$taug', temp_sep='$tsept', temp_oct='$toct', temp_nov='$tnov', temp_dec='$tdec',/*Precip */precip_jan='$pjan',precip_feb='$pfeb',precip_mar='$pmarch',precip_apr='$papril',precip_may='$pmay',precip_jun='$pjune',
    precip_jul='$pjuly', precip_aug='$paug', precip_sep='$psept', precip_oct='$poct', precip_nov='$pnov', precip_dec='$pdec'
     WHERE IDCity ='$ID'";

2 个答案:

答案 0 :(得分:1)

我确信很容易转换为其他Sql环境的Sql Server世界中的一个技巧是测试更新中的值,如果为null,则只使用现有值。

UPDATE city
SET
Population = @population --sql server syntax for parameters,
...--other columns
IDTimeZone = Case When @IDTimeZone IS NULL Then IDTimeZone Else @IDTImeZone End,
...--other columns
WHERE
IDCity = @IDCity

它的要点很简单......有价值吗?如果是,请设置它...否则,只需将其设置为表中先前值的任何值,实际上不会更改该列值。

答案 1 :(得分:0)

我的第一个问题是:你不能在某个地方缓存时区数据而不是每次都查询它吗?

好的,如果我理解了你的问题,你想要发布更新,尽管用户可能没有选择时区。就数据库而言,除非数据库设计者故意将字段定义为NOT NULL,否则CITY表的外键字段将接受NULL值 - 这是可能的。

但是......您正在执行Update语句,因此城市记录必须已经存在。我的第二个问题是:为什么你没有在现有记录中阅读并预先加载时区下拉的值已经存在(以及日出,日落和所有其他东西) ?因此,无论用户是更改还是单独使用,您都可以。

唯一的问题是插入新城市记录时用户未选择时区且时区字段已声明为NOT NULL。好吧,然后告诉用户时区是必需的信息,拒绝继续,直到他们选择了什么。

我错过了什么吗?