Archiv der Kategorie: DB

Unique-Constraint greift nur bei Nicht-null Einträgen

Bei einem Unique-Constraint über mehrere Spalten verhalten sich Null-Values nicht, wie man es erwartet. Bei zwei Spalten A und B in einem Unique-Constraint, kann nur eine Zeile mit Werten (‚a‘, ‚b‘) einfügen.

Hingegen funktioniert das Einfügen beliebig vieler Zeilen mit z. B. den Werten („a“, null). Da lohnt es sich, wieder mal in die Definitionen zu schauen.

HHH-1657

Aus Spaß trug ich mich in die Benachrichtigung eines sehr ärgerlichen und als ‚major‘ bezeichneten Fehlers bei Hibernate ein: HHH-1657.

Die Daten hierzu:

  • Created:
    Updated:
    Resolved:

In Worten zweitausendundsechs erzeugt. Die Krönung ist, er scheint trotz JIRA-Status nicht gefixed zu sein. Was soll man dazu noch sagen. Einfach die Kommentare lesen.

Pitfall: Escaping in JDBC (Spring-JDBC-Template)

In Java benutzt man gerne den ‚_‘ als logischem Trenner. In ORACLE ist dies leider ein Platzhalter für ein Zeichen und sorgt so für eine gefährliche Tücke.
Wenn man unglücklicherweise eine Mustersuche hat mit „%_XXXX_%“ nach welcher gelöscht werden soll, dann löscht man im Zweifelsfalle mehr Kundendaten, als einem lieb ist.

In der Tabelle haben wir 2 Einträge:
AAA_175679_A
AAA_75679_A.

Mit einem Query-String derart „%_75679_%“ erhalten wir selbstverständlich beide Einträge von der Datenbank.

Kein Ergebnis, obwohl ‚\‘ der Default-Escape-Charakter in ORACLE ist:

List<String> queryForList = minervaJdbcTemplate.queryForList(
"select * from t_test where name like '%\\_75679\\_%'", String.class);

Wieder kein Ergebnis, obwohl ‚\\‘ als Escape-Charakter benutzt werden sollte:

queryForList = minervaJdbcTemplate.queryForList("select * from t_test where name like '%\\\\_75679\\\\_%'",
String.class);

Genau unser eines Ergebnis AAA_75679_A, da wir mit der Spezial-Notation {ESCAPE ‚&‘} dem JDBC ‚&‘ als Escape-Charakter vorgeben:

queryForList = minervaJdbcTemplate.queryForList(
"select * from t_test where name like '%&_75679&_%' {ESCAPE '&'}", String.class);

Oracle Platzbedarf

Wenn man kein DBA ist, aber trotzdem mal schnell schauen möchte, z. B. wie groß ein Dump wohl werden wird auf der kleinen Austauschpartition beim Kunden:

select sum(bytes)/power(2,30) || 'GB' as sum from user_segments where segment_name like T_%;

In Megabytes bekommt man das Ganze mit power(2,20).