Start · Sprachen · JavaScript · Referenz · IDBObjectStore.autoIncrement

IDBObjectStore.autoIncrement

Eigenschaft

Schreibgeschützte Eigenschaft, die angibt, ob der Object Store Schlüssel automatisch über einen Schlüsselgenerator erzeugt (<code>true</code>) oder nicht (<code>false</code>).

seit JavaScript Baseline: alle Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

IDBObjectStore.autoIncrement

Beschreibung

Die Eigenschaft autoIncrement eines IDBObjectStore liefert den Wert des Auto-Increment-Flags, das beim Anlegen des Stores über IDBDatabase.createObjectStore(name, { autoIncrement: true }) gesetzt wurde. Ist das Flag aktiv, besitzt der Store einen Schlüsselgenerator, der bei jedem Einfügen ohne expliziten Schlüssel eine fortlaufende Ganzzahl (beginnend bei 1) vergibt.

Nützlich ist die Eigenschaft vor allem in generischem Code – etwa in Datenbank-Hilfsbibliotheken, Export-/Import-Werkzeugen oder Migrationsskripten –, der zur Laufzeit herausfinden muss, ob beim Aufruf von add() bzw. put() ein Schlüssel mitgegeben werden muss oder ob die Datenbank ihn selbst erzeugt.

Zusammen mit keyPath ergibt sich das Schlüsselverhalten des Stores: Bei keyPath + autoIncrement wird der generierte Schlüssel direkt in das Objekt geschrieben (z. B. in id); ohne keyPath bleibt der Schlüssel „out-of-line“ und wird nur als Rückgabewert der Anfrage geliefert.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Store einen Schlüsselgenerator besitzt, sonst false. Der Wert ist nach dem Anlegen des Stores unveränderlich.

Beispiele

Store mit Auto-Increment anlegen und Flag prüfen

const request = indexedDB.open('notizen-db', 1);

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  const store = db.createObjectStore('notizen', { keyPath: 'id', autoIncrement: true });
  console.log('autoIncrement:', store.autoIncrement);
};
autoIncrement: true

Generisch einfügen – Schlüssel nur bei Bedarf übergeben

const speichern = (db, storeName, wert, schluessel) =>
  new Promise((resolve, reject) => {
    const tx = db.transaction(storeName, 'readwrite');
    const store = tx.objectStore(storeName);

    // Out-of-line-Schlüssel ohne Generator muss explizit übergeben werden
    const brauchtSchluessel = store.keyPath === null && !store.autoIncrement;
    if (brauchtSchluessel && schluessel === undefined) {
      reject(new Error(`Store "${storeName}" benötigt einen expliziten Schlüssel`));
      return;
    }

    const req = brauchtSchluessel ? store.add(wert, schluessel) : store.add(wert);
    req.onsuccess = () => resolve(req.result);
    req.onerror = () => reject(req.error);
  });

// Nutzung
const open = indexedDB.open('notizen-db', 1);
open.onsuccess = async () => {
  const id = await speichern(open.result, 'notizen', { text: 'Einkaufen' });
  console.log('Neue ID:', id);
};
Neue ID: 1

Schema aller Stores ausgeben

const open = indexedDB.open('notizen-db');
open.onsuccess = () => {
  const db = open.result;
  const namen = [...db.objectStoreNames];
  if (namen.length === 0) return;
  const tx = db.transaction(namen, 'readonly');
  for (const name of namen) {
    const store = tx.objectStore(name);
    console.log(`${name}: keyPath=${JSON.stringify(store.keyPath)}, autoIncrement=${store.autoIncrement}`);
  }
};
notizen: keyPath="id", autoIncrement=true

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie store.autoIncrement = true hat keine Wirkung (im Strict Mode TypeError). Das Flag lässt sich nur beim Anlegen festlegen; zum Ändern muss der Store in einem upgradeneeded-Handler gelöscht und neu erstellt werden (Daten vorher sichern!).
  • Zähler wird nie zurückgesetzt: Auch nach delete() oder clear() läuft der Generator weiter; Lücken in den IDs sind normal. Nur Abbruch der Transaktion setzt den Zähler zurück.
  • Wird ein expliziter numerischer Schlüssel größer als der aktuelle Zählerstand eingefügt, springt der Generator auf diesen Wert + 1.
  • Der Maximalwert ist 253; danach schlägt add() mit ConstraintError fehl.
  • Bei autoIncrement zusammen mit einem Array-keyPath wirft createObjectStore() einen InvalidAccessError.
  • Kompatibilität: In allen modernen Browsern verfügbar, auch in Web Workern; nicht in Node.js ohne Polyfill (z. B. fake-indexeddb).