Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP, SQL/MySQL ja id-numeron kasvun hillintä

xxmss [05.08.2021 01:13:01]

#

Käytössä on PHP 7.x ja MySQL-kanta / InnoDB.

Taulussa kayttajien_lisenssit ovat uniikki id (auto increment), kayttaja_id ja seura_id.

id:n next autoindex = 111828

$lisenssit[] = "123 1";
$lisenssit[] = "234 15";
$lisenssit[] = "54 16";
$lisenssit[] = "65 15";
$lisenssit[] = "76 13";
$lisenssit[] = "546 12";
$lisenssit[] = "764 15";
$lisenssit[] = "105 17";
$lisenssit[] = "126 13";
$lisenssit[] = "763 10";
$lisenssit[] = "998 1";
$lisenssit[] = "879 13";
$lisenssit[] = "721 15";
$lisenssit[] = "904 16";
$lisenssit[] = "321 17";

if (count($lisenssit) > 0)
{
  $sql = "INSERT INTO kayttajien_lisenssit (kayttaja_id, seura_id) VALUES";
  $sql .= str_repeat(" (?, ?),", count($lisenssit));
  $sql = rtrim($sql, ",");
  $sql .= " ON DUPLICATE KEY UPDATE kayttaja_id = VALUES(kayttaja_id), seura_id = VALUES(seura_id)";

  $kysely3 = $yhteys->prepare($sql);

  $i = 1;

  foreach ($lisenssit as $apu_indeksi => $lisenssi)
  {
    list($kayttaja_id, $seura_id) =  explode(" ", $lisenssi);

    $kysely3->bindValue($i++, $kayttaja_id, PDO::PARAM_INT);
    $kysely3->bindValue($i++, $seura_id, PDO::PARAM_INT);
  }

  $kysely3->execute();
}

Nyt kun MySQL-kantaan lisätään 15 riviä, id:n next autoindex = 111843.

Mitenkäs tämän saisi niin, että auto increment kasvaisi ainoastaan silloin, jos kantaan lisätään täysin uusi rivi?

Eli jos kannassa on jo samanlainen lisenssi (sama kayttaja_id ja sama seura_id kuin sinne yritetään lisätä) ja tämän takia insertissä toteutuu ON DUPLICATE KEY UPDATE, niin käytettäisiinkin jo olemassa olevan lisenssin id:tä eikä next autoindex kasvaisi.

Grez [05.08.2021 07:13:38]

#

Onhan siellä Unique key määritelty jossa on nuo kaksi kenttää? ON DUPLICATE KEY vaattii toimiakseen primary tai unique avaimen. Silloin sinne ei ole muutenkaan mahdollista laittaa useampaa riviä, joilla olisi sama kayttaja_id ja seura_id.

CREATE UNIQUE INDEX haluamasinimi
ON  kayttajien_lisenssit (kayttaja_id, seura_id);

Teuro [05.08.2021 07:20:26]

#

Toisaalta jokaisen uuden lisenssin voisi merkitä uutena rivinä ja hakea aina uusimman lisenssin peliluvan tarkistusta varten. Tällöin saisi tehtyä myös raportin, josta selviää kuinka monta lisenssiä kukin käyttäjä on hankkinut. Tämä siis oletuksella, että tällainen tieto kiinnostaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta