Software:
MariaDB 10.3.22 op Debian testing
storage engine: InnoDB
Collation: utf8mb4
kolomtype: varchar(512)
Ik heb een programmaatje draaien dat dagelijks de bestandsnamen uit een aantal directories, recursief, inleest en wegschrijft naar een SQL-database. Voor het wegschrijven wordt de tabel leeggegooid.
Je zou verwachten dat bestandsnamen (volledig, met padnaam) uniek zijn, maar ik wilde toch een UNIQUE-constraint of een Primary key op de tabel zetten. En dat lukt niet, omdat bepaalde entries twee keer voorkomen.
levert
De entries op zich zjjn correct, ik bedoel, het gaat echt om twee verschillende bestanden. Dat kan, onder Linux/EXT4.
Maar doe ik dit
dan krijg ik nog een record terug, namelijk
En, als variant op het vorige voorbeeld:
geeft
Dus, twee verschillende records worden in een GROUP BY of DISTINCT toch als identiek gezien.
Wat kan hier aan de hand zijn? En vooral, hoe los ik het zo op dat ik toch een constraint of een primary key kan zetten?
Zoeken op Google (innodb unique constraint) leverde o.a. https://dba.stackexchange...onstraint-on-large-column op, maar daar wordt gesproken over een limiet, op de index, van 767 bytes. Zo lang is mijn kolom niet.
MariaDB 10.3.22 op Debian testing
storage engine: InnoDB
Collation: utf8mb4
kolomtype: varchar(512)
Ik heb een programmaatje draaien dat dagelijks de bestandsnamen uit een aantal directories, recursief, inleest en wegschrijft naar een SQL-database. Voor het wegschrijven wordt de tabel leeggegooid.
Je zou verwachten dat bestandsnamen (volledig, met padnaam) uniek zijn, maar ik wilde toch een UNIQUE-constraint of een Primary key op de tabel zetten. En dat lukt niet, omdat bepaalde entries twee keer voorkomen.
code:
1
2
3
| SELECT filenames FROM tbl_filenames WHERE UPPER(filenames) LIKE '%STAND BY ME%'; |
levert
code:
1
2
| /mnt/d353bdd4-32af-497a-90de-8971cfc40429/Public/Shared Music/mmedia/F/Flying Pickets/Stand by me.mp3 /mnt/d353bdd4-32af-497a-90de-8971cfc40429/Public/Shared Music/mmedia/F/Flying Pickets/Stand By Me.mp3 |
De entries op zich zjjn correct, ik bedoel, het gaat echt om twee verschillende bestanden. Dat kan, onder Linux/EXT4.
Maar doe ik dit
code:
1
2
3
| SELECT DISTINCT filenames/*, COUNT(*)*/ FROM tbl_filenames WHERE UPPER(filenames) LIKE '%STAND BY ME%'; |
dan krijg ik nog een record terug, namelijk
code:
1
| /mnt/d353bdd4-32af-497a-90de-8971cfc40429/Public/Shared Music/mmedia/F/Flying Pickets/Stand by me.mp3 |
En, als variant op het vorige voorbeeld:
code:
1
2
3
4
| SELECT COUNT(*), filenames FROM tbl_filenames WHERE UPPER(filenames) LIKE '%STAND BY ME%' GROUP BY filenames; |
geeft
code:
1
| 2 /mnt/d353bdd4-32af-497a-90de-8971cfc40429/Public/Shared Music/mmedia/F/Flying Pickets/Stand by me.mp3 |
Dus, twee verschillende records worden in een GROUP BY of DISTINCT toch als identiek gezien.
Wat kan hier aan de hand zijn? En vooral, hoe los ik het zo op dat ik toch een constraint of een primary key kan zetten?
Zoeken op Google (innodb unique constraint) leverde o.a. https://dba.stackexchange...onstraint-on-large-column op, maar daar wordt gesproken over een limiet, op de index, van 767 bytes. Zo lang is mijn kolom niet.