2012-02-24 32 views
0

由於訂戶表自動編號將附加1,即使發生事務錯誤並且回滾沒有幫助。然後,它不能在list_子表中添加信息,因爲該ID是不相符的,所以我用在mysql數據庫操作中這不是一個好的做法嗎?

ALTER TABLEID自動INC = 1

零下自動INC號碼,我把它放在catch塊沒有另一個try-catch。但這是常見的做法嗎?三江源

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); 
$conn->beginTransaction(); 
try { 

    $email = $_POST['Email']; 
    $FirstName = $_POST['FirstName']; 
    $LastName = $_POST['LastName']; 


    $query="INSERT INTO subscriber (Email,FirstName,LastName,CreateDate) VALUES (?,?,?,CURDATE())"; 
    $stmt = $conn->prepare($query); 


    $stmt->bindParam(1, $email , PDO::PARAM_STR); 
    $stmt->bindParam(2, $FirstName, PDO::PARAM_STR); 
    $stmt->bindParam(3, $LastName, PDO::PARAM_STR); 
    $stmt->execute(); 
    $conn->commit(); 

} 
catch(PDOException $e) 
    { 
    $conn->rollBack(); 
    $query="ALTER TABLE subscriber AUTO_INCREMENT = 1"; 
    $stmt = $conn->prepare($query); 
    $stmt->execute(); 
    die ($e->getMessage()."<a href='addSub.php'>Back</a>"); 
    } 

$conn->beginTransaction(); 
try { 
    $userID = $_SESSION['username']; 
    $query="INSERT INTO list_sub (SubID,ListID) VALUES ('',$_SESSION[ListID])"; 
    $stmt = $conn->prepare($query); 
    $stmt->execute(); 
    $conn->commit(); 

} 
catch(PDOException $e) 
    { 
    $conn->rollBack(); 
    die ($e->getMessage()."<a href='addSub.php'>Back</a>"); 
    } 

$conn = null;} 

表:Subsciber

1 SubID int(11)   No None AUTO_INCREMENT Change  Drop More 
2 Email varchar(100) utf8_general_ci  No None   Change  Drop More 
3 FirstName varchar(100) utf8_general_ci  Yes NULL   Change  Drop More 
4 LastName varchar(100) utf8_general_ci  Yes NULL   Change  Drop More 
5 CreateDate date   No None   Change  Drop More 
6 UpdateDate date   Yes NULL   Change  Drop More Check All/Uncheck All With selected: Browse Change Drop Primary Unique Index 

表:list_sub

1 SubID int(11)   No None AUTO_INCREMENT Change  Drop More 
2 ListID int(11)   No None   Change  Drop More 

表:表

1 ListID int(11)   No None AUTO_INCREMENT Change  Drop More 
2 ListName varchar(100) utf8_general_ci  No None   Change  Drop More 
3 FromName varchar(100) utf8_general_ci  No None   Change  Drop More 
4 ReplyTo varchar(100) utf8_general_ci  No None   Change  Drop More 
5 Subject varchar(100) utf8_general_ci  No None   Change  Drop More 
6 IsRemindSub tinyint(1)   No None   Change  Drop More 
7 IsRemindUnSub tinyint(1)   No None   Change  Drop More 
8 CreateDate date   No None   Change  Drop More 
9 Reminder varchar(100) utf8_general_ci  No None   Change  Drop More 
+2

因爲數據庫不關心值是否是順序的,只是它們是唯一的。這就是爲什麼你也應該這樣做...... – 2012-02-24 03:56:33

+0

但是一旦發生錯誤,我無法追加其他有效記錄。 table subscriber auto-inc no。 +1,table list_sub auto-inc no。提醒相同 – user782104 2012-02-24 04:01:31

+0

這是可怕的糟糕的設計,它確實是。只需在第二張桌子上放下自動增量。你已經知道你想要的價值是什麼。你不應該依靠數據庫來爲你做對。 – 2012-02-24 04:21:26

回答

0

,我認爲它是壞的設計有一個有意義的自動增加字段,原因比如你描述的那個。並不總是可以確保按照您希望的方式分配號碼。

在這種情況下,命令似乎是用戶號碼16(說)是第16個用戶。但是用戶號碼必須以這種方式連續存在嗎?我擔心的是,爲了滿足這個規則,你的代碼會增加額外的複雜性。我重視簡單性高於一切。

+0

我如何修改?其實id對我來說沒有意義,它只是list_sub中的一個forgien鍵 – user782104 2012-02-24 04:24:44

+0

請參閱我上面的評論。只需在第二張桌子上放下自動增量,然後傳入將記錄插入第一張時分配的值。你可以通過調用mysql_insert_id來恢復這個值。 – 2012-02-24 04:29:41

+0

第二個表是必要的,因爲我必須知道哪個子系列在哪個列表中。而subsciber - list在多對多的關係中。 – user782104 2012-02-24 04:34:46

0

不,我不認爲這是一個很好的做法。這只是一個ID。它並不真的給你提供關於對象的任何數據,它只是使它更容易搜索它。

如果你想保持順序只是爲了保持順序.....它主要是一個美學的東西。不要擔心。您的代碼將更容易編碼和閱讀。

如果你想某種全球唯一標識符出於某種原因,那麼也許你想要這樣的事情....但即使這樣你並不需要它。

+0

謝謝,我必須保持順序,因爲我不能存在插入錯誤後,在list_sub中添加記錄。用戶的自動增量是+1 ,但是list_sub不+1 – user782104 2012-02-24 04:31:13

相關問題