Can CURRENT_TIMESTAMP
bir olarak kullanılabilir PRIMARY KEY
?
İki veya daha fazla farklı INSERT'in aynı olma olasılığı var mı CURRENT_TIMESTAMP
?
Can CURRENT_TIMESTAMP
bir olarak kullanılabilir PRIMARY KEY
?
İki veya daha fazla farklı INSERT'in aynı olma olasılığı var mı CURRENT_TIMESTAMP
?
Yanıtlar:
Gereğince belgelerin , hassas CURRENT_TIMESTAMP
mikro saniyedir. Bu nedenle, bir çarpışma olasılığı düşüktür, ancak mümkündür.
Şimdi çok nadiren meydana gelen ve veritabanı hatalarına neden olan bir hata düşünün . Hata ayıklamak ne kadar zor? En azından deterministik olandan çok daha kötü bir hatadır.
Daha geniş bağlam: dizilerle bu küçük nüanslardan kaçınmak istersiniz, bu da MySQL'e alışkınsanız özellikle can sıkıcıdır.
Ayrıca, işlemleri kullanıyorsanız (çoğu web çerçevesi, özellikle de Java olanları!), Zaman damgaları bir işlem içinde aynı olacaktır! Bir gösteri:
postgres=# begin;
BEGIN
postgres=# select current_timestamp;
current_timestamp
-------------------------------
2018-08-06 02:41:42.472163+02
(1 Zeile)
postgres=# select current_timestamp;
current_timestamp
-------------------------------
2018-08-06 02:41:42.472163+02
(1 Zeile)
Görüşürüz? İki seçim, aynı sonuç. Çok hızlı yazmıyorum. ;-)
-
Kimlikleri kullanmaktan kaçınarak kolayca kimlikler istiyorsanız, kayıtların gerçek tanımlayıcılarından bir karma değer oluşturun. Örneğin, veritabanınızda insanlar varsa ve doğum tarihlerinin, annenin kızlık adının ve gerçek adının onları benzersiz bir şekilde tanımladığını biliyorsanız,
md5(mother_name || '-' || given_name || '-' birthday);
id. Bunun yanı sıra CreationDate
, tabloyu dizine ekledikten sonra bir sütun kullanabilirsiniz , ancak bu bir anahtar değildir (id).
Ps Genel olarak, DB mümkün olduğunca deterministik yapmak için çok iyi bir uygulamadır . Yani aynı işlem DB'de aynı değişikliği yaratmalıdır . Zaman damgası tabanlı herhangi bir kimlik bu önemli özellikte başarısız olur. Hata ayıklamak veya herhangi bir şeyi simüle etmek isterseniz ne olur? Bir işlemi yeniden oynatırsınız ve aynı nesne farklı bir kimlikle oluşturulur ... takip etmek gerçekten zor değildir ve çok fazla çalışma saati harcar.
Ps2 Kodunuzu gelecekte kontrol eden herkes, yukarıdaki nedenlerle zaman damgası tarafından oluşturulan kimlikleri görmek için en iyi fikre sahip olmayacaktır.
INSERT
Birden çok satırdan birini yaparsanız , hepsi aynı olur current_timestamp
. Ve sonra tetikleriniz var ...
CURRENT_TIMESTAMP için birbirini izleyen iki INSERT (veya birden fazla satır içeren tek bir INSERT) için iki özdeş değer sağlaması mümkün değil.
Bunun yerine zamana dayalı bir UUID kullanın: uuid_generate_v1mc () .
Kesinlikle söylemek gerekirse: Hayır. Çünkü CURRENT_TIMESTAMP
bir işlevdir ve yalnızca bir veya daha fazla tablo sütunu bir PRIMARY KEY
kısıt oluşturabilir .
PRIMARY KEY
Varsayılan değere sahip bir sütunda bir kısıtlama oluşturmak istiyorsanız CURRENT_TIMESTAMP
, cevap: Evet, yapabilirsiniz . Hiçbir şey, oğlunuzun kafasından elma çekmekten alıkoyacak hiçbir şey yapmanıza engel olmaz. Soru, amacını tanımlamazken yine de anlamlı olmaz. Sütun ve tablonun ne tür veriler tutması gerekir? Hangi kuralları uygulamaya çalışıyorsunuz?
Tipik olarak, aynı işlem (işlemin başlangıç zamanı) için aynı değeri döndüren CURRENT_TIMESTAMP
bir STABLE
işlev olduğundan , fikir yinelenen anahtar hatalarına neden olur . Aynı işlemdeki birden çok INSERT, daha önce gösterilen diğer yanıtlar gibi çarpışmaya bağlıdır. Kullanım kılavuzu:
Bu işlevler geçerli işlemin başlangıç zamanını döndürdüğünden, işlem sırasında değerleri değişmez. Bu bir özellik olarak kabul edilir: amaç, tek bir işlemin "geçerli" zaman konusunda tutarlı bir fikre sahip olmasını sağlamaktır, böylece aynı işlem içindeki birden fazla değişiklik aynı zaman damgasını taşır.
Postgres zaman damgaları, 6 fraksiyonel basamağı (mikrosaniye çözünürlük) temsil eden 8 baytlık tamsayılar olarak uygulanır.
Eğer (adlandırılmış bir şey sen mikrosaniye başına en fazla bir satır tutmak gerekiyordu bir tablo inşa ediyoruz ve bu koşul değişikliğine gitmiyor sensor_reading_per_microsecond
), ardından da mantıklı olabilir. Yinelenen satırlar vardır sözde yinelenen bir anahtar ihlali hatası yükseltmek. Yine de bu egzotik bir istisna. Ve veri tipi timestamptz
(değil timestamp
) muhtemelen tercih edilir. Görmek:
Bunun yerine bir yedek seri birincil anahtar kullanmayı tercih ederim. Ve UNIQUE
zaman damgası sütununa bir kısıtlama ekleyin . RDBMS'nin uygulama detaylarına dayanmayan daha az olası komplikasyon.
sensor_reading_per_microsecond
Her okuma zamanlamasının bir öncekine göre mükemmel şekilde senkronize edildiğini kesinlikle garanti edemezseniz bile çarpışabilir; bir mikrosaniye-altı sapma (ki bu genellikle imkansız değildir) şemayı bozar. Genel olarak bundan tamamen kaçınırdım. (Belirttiğiniz gibi, böyle bir durumda, ortaya çıkan çarpışma arzu edilebilir!)