Разве это не хорошая практика в работе с базой данных MySQL? - PullRequest
0 голосов
/ 24 февраля 2012

Так как автоматический номер таблицы подписчика будет добавляться 1, даже если произошла ошибка транзакции и откат не помог. Тогда он не может добавить информацию в таблицу sub_ list, так как идентификатор не согласован, поэтому я использую

alter tableid auto inc = 1

, чтобы минус число авто inc, и я помещаю его в блок catch без другой попытки. Но это обычная практика? Thankyou

$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 ]

0 голосов
/ 24 февраля 2012

нет, я не думаю, что это хорошая практика вообще.Это просто идентификатор.На самом деле он не дает никаких данных об объекте, он только облегчает его поиск.

Если вы хотите, чтобы он был последовательным только ради того, чтобы сохранять его последовательным ... это в основном эстетическая вещь.Не беспокойся об этом.Ваш код будет намного легче кодировать и читать.

Если по какой-то причине вам нужен какой-то глобальный уникальный идентификатор, то, возможно, вы захотите такого рода вещи .... но даже тогда вам это не нужно.

0 голосов
/ 24 февраля 2012

Я думаю, что плохой дизайн - иметь значимое поле автоинкремента по таким причинам, как та, которую вы описываете.Не всегда возможно гарантировать, что номера будут распределены так, как вы хотите.

В этом случае необходимо, чтобы абонент номер 16 (скажем) был 16-м абонентом.Но обязательно ли номера абонентов должны быть смежными таким образом?Меня беспокоит то, что вы добавляете дополнительную сложность к своему коду, чтобы удовлетворить это правило.Я ценю простоту превыше всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...