You are correct, however, if there were a unique constraint placed on tracks.name, then a given track could only appear once (in the first case), or in multiple places (in the second case).
> -----Original Message----- > From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] > On Behalf Of Ken Wagner > Sent: Monday, 9 January, 2017 23:46 > To: SQLite mailing list > Subject: Re: [sqlite] Foreign key error... > > Keith, > > "this does not allow the same track on multiple albums" with the same > trackno, but a different trackno seems to work. Thus results cannot be > guaranteed valid? > > Ken > > > On 01/08/2017 06:57 AM, Keith Medcalf wrote: > > On Sunday, 8 January, 2017 05:05, Ken Wagner <beauco...@gmail.com> > wrote: > > > >> Keith, > >> > >> Ahh, better to be specific and avoid simplistic assumptions. > >> > >> For foreign keys which is better: 'trackerartist' or 'artistid' in the > >> track file? Does it matter? Is it personal preference? > > It is a matter of personal preference. Personally, I use the same name > for the same data, and do not add useless prefaces, and usually do not > preface the id with the table name. For example: > > > > create table artists ( > > id integer primary key, > > name text collate nocase unique > > ); > > create table albums ( > > id integer primary key, > > name text collate nocase unique, > > artistid integer references artists > > ); > > create table tracks ( > > id integer primary key, > > seq integer, > > name text collate nocase, > > artistid integer references artists, > > albumid integer references albums, > > unique (albumid, seq) > > ); > > > > select albums.name as albumname, > > albumartists.name as albumartist, > > tracks.seq as trackno, > > tracks.name as trackname, > > trackartists.name as trackartist > > from albums, tracks, artists as albumartists, artists as trackartists > > where tracks.artistid = trackartists.id > > and tracks.albumid = albums.id > > and albums.artistid = albumartists.id; > > > > Of course, this does not allow the same track on multiple albums. For > that you need another table to do the N:M mapping: > > > > create table artists ( > > id integer primary key, > > name text collate nocase unique > > ); > > create table albums ( > > id integer primary key, > > name text collate nocase unique, > > artistid integer references artists > > ); > > create table tracks ( > > id integer primary key, > > name text collate nocase, > > artistid integer references artists, > > ); > > create table albumtracks ( > > id integer primary key, > > albumid integer references albums, > > trackid integer references tracks, > > seq integer, > > unique (albumid, seq), > > unique (albumid, trackid), > > unique (trackid, albumid) > > ); > > > > select albums.name as albumname, > > albumartists.name as akbumartist, > > albumtracks.seq as trackno, > > tracks.name as trackname, > > trackartists.name as trackartist > > from albums, albumtracks, tracks, artists as albumartists, artists as > trackartists > > where tracks.artistid = trackartists.id > > and albumtracks.albumid = albums.id > > and albumtracks.trackid = tracks.id > > and albums.artistid = albumartists.id; > > > >> On 01/08/2017 05:46 AM, Keith Medcalf wrote: > >>> ... join ... using (column) has nothing whatever to do with foreign > >> keys. > >>> "FROM a JOIN b USING (c) is "syntactic sugar" (meaning that it is > >> sweetening and full of calories, but has no nutritional value) for the > >> expression "FROM a, b WHERE a.c = b.c" > >>> This is so, for example, if you use really long stupid names it saves > >> considerable space and typing: > >>> SELECT * FROM TheFirstTableToBeJoined JOIN TheSecondTableToBeJoined > >> USING (TheCommonColumnNameBetweenTheFirstAndTheSecondTable); > >>> -vs- > >>> SELECT * FROM TheFirstTableToBeJoined, TheSecondTableToBeJoined WHERE > >> > TheFirstTableToBeJoined.TheCommonColumnNameBetweenTheFirstAndTheSecondTabl > >> e = > >> > TheSecondTableToBeJoined.TheCommonColumnNameBetweenTheFirstAndTheSecondTab > >> le; > >>> > >>>> -----Original Message----- > >>>> From: sqlite-users [mailto:sqlite-users- > >> boun...@mailinglists.sqlite.org] > >>>> On Behalf Of Ken Wagner > >>>> Sent: Sunday, 8 January, 2017 04:04 > >>>> To: SQLite mailing list > >>>> Subject: Re: [sqlite] Foreign key error... > >>>> > >>>> Thanks, Kees, > >>>> > >>>> The message is helpful as a warning. > >>>> > >>>> select artistname, trackname from artist inner join track on > >>>> trackartist = artistid; works just fine. > >>>> > >>>> But isn't the efficiency of 'using (artistid)' more desirable? > >>>> > >>>> Is the use of a 'trackerartist' as the foreign key used because it is > >>>> more informative? > >>>> > >>>> I.e., wherever it is seen it shows the track-artist link? But is more > >>>> demanding when coding: > >>>> > >>>> 'on trackerartist = artistid' vs 'using (artistid)' > >>>> > >>>> Best or preferred SQLite3 practice for using which foreign reference > >>>> style 'trackartist' vs 'artistid'? > >>>> > >>>> Thanks, > >>>> Ken > >>>> > >>>> > >>>> On 01/08/2017 04:47 AM, Kees Nuyt wrote: > >>>>> On Sun, 8 Jan 2017 04:21:16 -0600, Ken Wagner > >>>>> <beauco...@gmail.com> wrote: > >>>>> > >>>>>> Hello SQLusers, > >>>>>> > >>>>>> The error below occurs even though the > >>>>>> > >>>>>> CREATE TABLE track( > >>>>>> > >>>>>> trackid INTEGER, > >>>>>> trackname TEXT, > >>>>>> trackartist INTEGER, > >>>>>> *FOREIGN KEY(trackartist) REFERENCES artist(artistid)* > >>>>>> ); > >>>>>> > >>>>>> statement at https://sqlite.org/foreignkeys.html was observed. > >>>>>> > >>>>>> It appears that 'trackerartist' should be named 'artistid'. > >>>>>> > >>>>>> SQLite3 CLI results using version SQLite 3.15.2 2016-11-28 19:13:37 > >>>>>> bbd85d235f7037c6a033a9690534391ffeacecc8 > >>>>>> > >>>>>> sqlite> select artistname, trackname from artist inner join track > >> using > >>>>>> (trackartist); > >>>>>> Error:\ cannot join using column trackartist - column not present > in > >>>>>> both tables > >>>>>> sqlite> .tables track > >>>>>> track > >>>>>> sqlite> .schema track > >>>>>> CREATE TABLE track( > >>>>>> trackid INTEGER, > >>>>>> trackname TEXT, > >>>>>> trackartist INTEGER, > >>>>>> FOREIGN KEY(trackartist) REFERENCES artist(artistid) > >>>>>> ); > >>>>>> sqlite> .schema artist > >>>>>> CREATE TABLE artist( > >>>>>> artistid INTEGER PRIMARY KEY, > >>>>>> artistname TEXT > >>>>>> > >>>>>> Am I missing something important here? > >>>>> The error message is quite informative: the artist table does > >>>>> not have a column trackartist. > >>>>> > >>>>> Try: > >>>>> select artistname, trackname from artist inner join track on > >>>>> trackartist = artistid; > >>>>> > >>>>> HTH > >>>>> > >>>> _______________________________________________ > >>>> sqlite-users mailing list > >>>> sqlite-users@mailinglists.sqlite.org > >>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > >>> > >>> _______________________________________________ > >>> sqlite-users mailing list > >>> sqlite-users@mailinglists.sqlite.org > >>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > >> _______________________________________________ > >> sqlite-users mailing list > >> sqlite-users@mailinglists.sqlite.org > >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > > > > > _______________________________________________ > > sqlite-users mailing list > > sqlite-users@mailinglists.sqlite.org > > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users