MySql tabloya veri bağımlı ekleme

3 Cevap php

Ben 2 tablolar var:

user_tb.username user_tb.point

review_tb.username review_tb.review

PHP (CodeIgniter) ile kodlama duyuyorum. Yani kullanıcı teslim etmişti inceleme ile review_tb veri eklemek çalışıyorum ve bu bir başarı ise, ben bazı noktaları ile kullanıcıyı ödüllendirecek.

Peki bu çok basit bir işlem gibi görünüyor. Biz ilk adı ile review_tb içine inceleme eklemek ve orada idam sorgu ile herhangi bir sorun olduğunu ve bunu bir başarı ise, biz user_tb de puan güncelleme ile devam edecek olmadığını kontrol etmek PHP kullanmak olacaktır.

Evet, ama burada sorun geliyor. Ne review_tb içine sokarak bir başarı ama biz tür review_tb sorgu "geri al" ya da biz review_tb yaptığı değişikliği "geri" olabilir user_tb içine sokarak ikinci sorgu, bir başarı değil ise.

Bu tür "ya hep ya hiç" gibi.

Bunun amacı, gerçek hayatta, biz daha fazla tablo yönetmek bir veritabanı olacak ve birbirlerine bağlıdır her tabloya daha fazla veri ekleme nerede, veritabanı üzerinde tüm verileri senkronize etmektir.

Biz PHP veya CodeIgniter'daki ya da sadece MySQL sorgu yapabilirsiniz nasıl bazı aydınlanma verin.

3 Cevap

Eğer SQL işlemleri için bir "ya hep ya hiç" davranış istiyorsanız, transactions arıyoruz; Burada MySQL kılavuzundan ilgili sayfası: 12.4.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax.

Wikipedia bu bu şekilde açıklar:

A database transaction comprises a unit of work performed within a database management system (or similar system) against a database, and treated in a coherent and reliable way independent of other transactions. Transactions in a database environment have two main purposes:

  1. To provide reliable units of work that allow correct recovery from failures and keep a database consistent even in cases of system failure, when execution stops (completely or partially) and many operations upon a database remain uncompleted, with unclear status.
  2. To provide isolation between programs accessing a database concurrently. Without isolation the programs' outcomes are typically erroneous.


Basically :

  • Eğer bir hareketi başlatmak
  • Eğer gerekeni yapmak; yani, ilk insert, ve güncelleme
  • herşey yolunda ise, işlem tamamlanamaz
  • sorguları herhangi biri ile herhangi bir sorun varsa başka, size geri alma hareketi; ve bu işlem yaptığı her şeyi iptal eder.

transactions and CodeIgniter here hakkında bir kılavuz sayfası bulunmaktadır.


Note that, with MySQL, no every Engine supports transaction ; between the two most used engines, MyISAM doesn't support transactions, while InnoDB supports them.

Eğer işlemler kullanmak değil miyim? Eğer daha sonra aynı işlem içinde hem ekler yaptım, eğer her ikisi de başarılı ya da yok de.

Böyle bir şey deneyin

BEGIN;
INSERT INTO review_tb(username, review) VALUES(x, y);
INSERT INTO user_tb(username, point) VALUES(x, y);
COMMIT;

(Örneğin InnoDb gibi) işlemleri destekleyen bir veritabanı motoru kullanmak gerekir unutmayın.

Eğer varsa InnoDB desteği kullanmak, ama ne zaman onun aşağıdakine benzer bir kod kullanabilirsiniz mümkün değildir:

 $result=mysql_query("INSERT INTO ...");
 if(!$result) return false;

 $result=mysql_query("INSERT INTO somewhereelse");
 if(!$result) {
      mysql_query("DELETE FROM ...");
      return false;
 }

 return true;

Bu temizleme hala başarısız olabilir, ama ekleme sorgusu çünkü çiftleri veya kısıtlamaları başarısız olduğunda çalışabilir. Beklenmedik sonlandırmaları için, tek yol işlemleri kullanmaktır.