2012-02-24 3 views
0

トランザクションエラーが発生したにもかかわらず、サブスクライバテーブルの自動番号が1になるため、ロールバックは役に立ちません。その後、IDが一致していないので、それはlist_サブテーブルに情報を追加することはできませんので、私はマイナス自動車株式会社番号にmysqlデータベース操作では良い習慣ではありませんか?

ALTER TABLEID自動INC = 1

を使用して、私はそれを置きます他のtry-catchのない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 

表:

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

表list_sub:リスト

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

データベースは、値が順次であるかどうかは気にしないので、それらは一意であるということだけです。だからあなたもあまりにも... –

+0

しかし、エラーが発生したら、私は他の有効なレコードを追加できません。 テーブルサブスクライバauto-inc no。 +1、table list_sub auto-inc no。同じことを思い出させる – user782104

+0

これは恐ろしく悪いデザインです、それは本当です。 2番目のテーブルに自動インクリメントをドロップするだけです。あなたはすでに価値があるものを知っています。データベースに頼るべきではありません。 –

答えて

0

私は意味のある自動を持っている悪いデザインだと思います理由のために増分フィールドあなたが描いているようなものです。数字があなたの望むように割り当てられることを常に保証することはできません。

この場合、加入者番号16(たとえば)が16番目の加入者であるように見えることがあります。しかし、加入者番号は絶対にこのように連続していなければなりませんか?私の懸念は、このルールを満たすために、コードに複雑さを追加することです。私は、とりわけシンプルさを重視しています。

+0

私はどのように変更できますか?実際にはIDは意味がありません。list_subの偽造キーです – user782104

+0

上記のコメントを参照してください。 2番目のテーブルに自動インクリメントをドロップし、最初のレコードにレコードを挿入するときに割り当てられた値を渡します。この値はmysql_insert_idを呼び出して回復できます。 –

+0

2番目のテーブルが必要です。サブスターがどのリストにあるのか知る必要があるからです。そして、subsciber - listは多対多の関係にあります。 – user782104

0

nah、これはまったく良い習慣だとは思わない。それは単なるIDです。オブジェクトに関するデータを実際に提供するわけではありませんが、オブジェクトを簡単に検索できるだけです。

それを連続的に保つために、それを連続的にしたいのであれば、それは主に美的なものです。ご心配なく。あなたのコードは、コード化して読みやすくなります。

何らかの理由でグローバル一意識別子が必要な場合は、この種のものが必要かもしれませんが、それでも実際には必要ありません。

+0

おかげで、挿入エラーが発生した後、list_subにレコードを追加します。サブスクライバのauto-incは+1 ですが、list_subは+1しません – user782104

関連する問題