-- Selbst gewählte Kurz-Links, umbenennbar, mit weiterhin gültigen Vorgängern. -- Frühere Kurz-Links eines Codes. Ohne sie würde jedes Umbenennen die bereits -- gedruckten Codes entwerten. CREATE TABLE "QrCodeAlias" ( "id" TEXT NOT NULL, "domainId" TEXT NOT NULL, "slug" TEXT NOT NULL, "qrCodeId" TEXT NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "QrCodeAlias_pkey" PRIMARY KEY ("id") ); CREATE UNIQUE INDEX "QrCodeAlias_domainId_slug_key" ON "QrCodeAlias"("domainId", "slug"); CREATE INDEX "QrCodeAlias_qrCodeId_idx" ON "QrCodeAlias"("qrCodeId"); ALTER TABLE "QrCodeAlias" ADD CONSTRAINT "QrCodeAlias_domainId_fkey" FOREIGN KEY ("domainId") REFERENCES "Domain"("id") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "QrCodeAlias" ADD CONSTRAINT "QrCodeAlias_qrCodeId_fkey" FOREIGN KEY ("qrCodeId") REFERENCES "QrCode"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- Gross- und Kleinschreibung soll beim Aufrufen keine Rolle spielen. Damit -- „Sommer" und „sommer" nicht als zwei verschiedene Kurz-Links vergeben werden -- koennen, gilt die Eindeutigkeit ab jetzt auf der kleingeschriebenen Form. -- -- Zuerst pruefen, ob der bestehende Bestand das ueberhaupt zulaesst. Bei -- erzeugten Kurz-Links aus acht Zeichen ist eine solche Kollision praktisch -- ausgeschlossen; ein stiller Datenverlust waere aber unentschuldbar, deshalb -- bricht die Migration in dem Fall lieber ab. DO $$ DECLARE kollisionen INT; BEGIN SELECT COUNT(*) INTO kollisionen FROM ( SELECT "domainId", LOWER("slug") FROM "QrCode" GROUP BY "domainId", LOWER("slug") HAVING COUNT(*) > 1 ) AS doppelt; IF kollisionen > 0 THEN RAISE EXCEPTION 'Es gibt % Kurz-Links, die sich nur in der Gross-/Kleinschreibung unterscheiden. Bitte einen davon umbenennen und die Migration erneut starten.', kollisionen; END IF; END $$; -- Der bestehende Index bleibt: Er traegt die exakten Nachschlagevorgaenge, und -- das ist der haeufige Fall — ein gescannter Code liefert die Adresse genau so, -- wie sie gespeichert ist. Der zweite Index kommt dazu und sorgt dafuer, dass -- sich zwei Kurz-Links nicht nur in der Gross-/Kleinschreibung unterscheiden -- koennen. CREATE UNIQUE INDEX "QrCode_domainId_lower_slug_key" ON "QrCode"("domainId", LOWER("slug")); CREATE UNIQUE INDEX "QrCodeAlias_domainId_lower_slug_key" ON "QrCodeAlias"("domainId", LOWER("slug"));