複合式唯一

edited 十一月 2013 in 資料庫
現有一 使用者折價券 資料表,我想避免以下狀況

欄位為 使用者ID(索引) 折價券ID(索引) 分享編號(主鍵)
__________1_____________1___________1
__________1_____________1___________2
__________1_____________2___________3

即 欲達成 使用者ID 非唯一,折價券ID 也非唯一
但是 使用者ID 、 折價券ID 合起來比較時,不可與其他筆資料重複
且 使用者ID 須保持foreign key 的角色

我是用PHPmyadmin

評論


  • 另一種方法是直接在新增資料的PHP檔裡設定
    查詢該使用者的所有 折價券ID 資料
    並一筆一筆的與要新增的折價券ID比對是否重複

    這樣表達應該比較清楚,因為PHPmyadmin查了一陣子都沒有說要怎麼設定
  • 1.
    你的 table
    使用者 : 使用者ID
    使用者折價券 : 使用者ID、折價券ID
    折價券 : 折價券名稱、折價券ID、所屬店家ID
    店家 : 店家ID、店家名稱

    看不出有'分享編號'這個欄位,所以無從判斷怎麼做(有時是資料結構不良所產生的問題)

    2.
    要'避免以下狀況'......;
    這類的問題要在新增前檢查,而不是靠資料庫的 key 或 index 來防呆;資料庫返回的訊息不是 user 可以看得懂的.

    用以下語法檢查是否重複,而不是把所有資料撈出來後再用 php 的 while 回圈比對,所以不會有'一筆一筆的與要新增的折價券ID比對是否重複'這類問題

    select count(*) as mycount
    from ta
    where ta.a1='xx'

    mycount=0,表ta內的 a1 找不到 xx
  • 出現了一個問題,在while裡的if條件,overlap_cp無法被識別
    所以直接被判斷為0
    overlap_cp 應為select結果的COUNT數量

    以下是部分程式碼

    $sql_overlap_cp = "SELECT COUNT(*) as overlap_cp
    FROM coupon_user
    WHERE coupon_user.id_user='$id_user' and coupon_user.id_cp='$id_cp' ";

    $result_overlap_cp = mysql_query($sql_overlap_cp) or die('MySQL query error');

    while($row_overlap_cp = mysql_fetch_array($result_overlap_cp))
    {
    if(overlap_cp==0)
    {
    echo "可新增此優惠券";
    }
    else
    {
    echo "已擁有此CP,不可再次接收";
    }
    }



  • 查一下 mysql_fetch_array 的用法,如何取得值
  • edited 十一月 2013
    不好意思,roger師兄,因為我的時間不多了,我無法一一了解各種語法

    方才找到了一個方法判斷

    $sql_overlap_cp = "SELECT id_cp
    FROM coupon_user
    WHERE coupon_user.id_user='$id_user' and coupon_user.id_cp='$id_cp' ";
    $result_overlap_cp = mysql_query($sql_overlap_cp) or die('MySQL query error');

    if (mysql_num_rows($result_overlap_cp) == 0)
    {
    echo "可新增此優惠券";
    }
    else
    {
    echo "已擁有此CP,不可再次接收";
    }

    再次感謝師兄的回應!!
    :)
  • $sSql1='select count(*) as mycount
    from base
    $s1 =mysql_query($sSql1,$conn);
    $s1_record =mysql_fetch_array($s1);
    // 資料筆數
    $Datacount=$s1_record[mycount];
Sign In or Register to comment.