![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? |
#3
| |||
| |||
|
|
Hi, I hope someone can share some of their professional advice and help me out with my embarissing problem concerning an Access INSERT query. I have never attempted to create a table with one-to-one relationship but on this occasion I must keep username/password details within a seperate table. Here's the basic specs and database schema: ------------------------------------------- Database: Basic MS Access 2000 MDB Table Relationships: Both tables are joined one-to-one on their ID fields. TableMembers ID: Long Integer; Required; Indexed(Unique); PrimaryKey; Firstname: Text 50; Required; Lastname: Text 50; Required; Telephone: Text 50; Required; TableAccounts ID: AutoNumber; Required; Indexed(Unique); PrimaryKey; Username: Text 50; Required; Password: Text 50; Required; The problem: ------------ In an ideal world I would like to use a single SQL INSERT on both tables to insert the required data. But I know this isn't possible as INSERT works on single tables only, right ? I cannot use an SQL INSERT on TableMembers as the ID field is created by the AutoNumber in TableAccounts.ID. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? When I open the TableAccounts Table in Access, I can manually input all data for both Tables without any problems. TableMembers Fields are displayed as a dropdown record from TableAccounts and the ID field is automatically taken care of. Can Anyone here can offer some advice or solutions, all replies greatly appreciated. Carl. |
#4
| |||
| |||
|
|
"Carl" wrote First, unless you have beaucoup data fields that you didn't list, why would you want to have these two tables with a one-to-one relationship? Obviously the simplest, easiest solution is to include all the information in a single table and you don't have to worry about matching keys. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? Retrieve the record you just entered*, and create the INSERT SQL with code, using that value for the key field just as you use values for any other field. * this may not be as easy as it seems, which may be a good argument, in some cases, for using a "natural key" rather than using AutoNumber as a surrogate key. Larry Linson Microsoft Access MVP |
#5
| |||
| |||
|
|
"Carl" wrote First, unless you have beaucoup data fields that you didn't list, why would you want to have these two tables with a one-to-one relationship? Obviously the simplest, easiest solution is to include all the information in a single table and you don't have to worry about matching keys. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? Retrieve the record you just entered*, and create the INSERT SQL with code, using that value for the key field just as you use values for any other field. * this may not be as easy as it seems, which may be a good argument, in some cases, for using a "natural key" rather than using AutoNumber as a surrogate key. |
#6
| |||
| |||
|
|
Do you have any experience with visual basic? If so, you could do at least a couple different things: 1) you could create your own routine to generate the ID value so that you don't have to use an autonumber field, and then you could insert into each table with your ID value. 2) you could use vb to insert the fields into the Accounts table, then read the ID of the newly inserted ID value, then insert that ID into the Members table. "Carl" <mail2carl (AT) _remove_yahoo (DOT) com> wrote in message news:MtZwe.13254$11.3650 (AT) newsfe2-win (DOT) ntli.net... Hi, I hope someone can share some of their professional advice and help me out with my embarissing problem concerning an Access INSERT query. I have never attempted to create a table with one-to-one relationship but on this occasion I must keep username/password details within a seperate table. Here's the basic specs and database schema: ------------------------------------------- Database: Basic MS Access 2000 MDB Table Relationships: Both tables are joined one-to-one on their ID fields. TableMembers ID: Long Integer; Required; Indexed(Unique); PrimaryKey; Firstname: Text 50; Required; Lastname: Text 50; Required; Telephone: Text 50; Required; TableAccounts ID: AutoNumber; Required; Indexed(Unique); PrimaryKey; Username: Text 50; Required; Password: Text 50; Required; The problem: ------------ In an ideal world I would like to use a single SQL INSERT on both tables to insert the required data. But I know this isn't possible as INSERT works on single tables only, right ? I cannot use an SQL INSERT on TableMembers as the ID field is created by the AutoNumber in TableAccounts.ID. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? When I open the TableAccounts Table in Access, I can manually input all data for both Tables without any problems. TableMembers Fields are displayed as a dropdown record from TableAccounts and the ID field is automatically taken care of. Can Anyone here can offer some advice or solutions, all replies greatly appreciated. Carl. |
#7
| |||
| |||
|
|
"Larry Linson" <bouncer (AT) localhost (DOT) not> wrote in news:ZB_we.24799$Ff6.8496@trnddc09: "Carl" wrote First, unless you have beaucoup data fields that you didn't list, why would you want to have these two tables with a one-to-one relationship? Obviously the simplest, easiest solution is to include all the information in a single table and you don't have to worry about matching keys. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? Retrieve the record you just entered*, and create the INSERT SQL with code, using that value for the key field just as you use values for any other field. * this may not be as easy as it seems, which may be a good argument, in some cases, for using a "natural key" rather than using AutoNumber as a surrogate key. Basically, I agree with Larry's reservations about the data structure. However, I've had applications where I needed to break down single tables into 1:1 sub-tables because the application needed what amounted to record subtypes. There are two basic ways to do this. 1. have a field in main side of the 1:1 join that has only one purpose, to hold a value that tells you "this record is being inserted right now." You'd put something like -10000000 in it during the insert, then use that value to identify the single record you've just added so you can select its PK value to insert into the second table. After you populate the second table, you set this special field in the first table to Null. The problem with this approach is that it doesn't work well in multi-user applications, unless you make the user name part of the ID field you're using to find the record that was just inserted. 2. write VBA code to insert the record in an AppendOnly recordset, so you can grab the PK value, then use that to write INSERT SQL to insert the record in the second table. You'd probably want to wrap this in a transaction to insure that the whole process completes. That is, if part of it fails you probably want the whole thing to fail. The 2nd choice is much more complex, but far more robust. -- David W. Fenton http://www.bway.net/~dfenton dfenton at bway dot net http://www.bway.net/~dfassoc |
#8
| |||
| |||
|
|
Hi John.....I do but I prefer Perl as it will be a internet based database running on Unix and Win32. It looks like the only solution is to create my own ID generation routines. I cannot rely on a INSERT then a SELECT to get the last ID entered. There may be a situation where after the INSERT to the AccountsTable, another client may create a new Account which would trigger another INSERT. How do you "read" the ID of the newly inserted ID ??? What do you mean by this ?? What happens if another INSERT is triggered before I've "read" the previous ID ?? I was under the impression that INSERT querys don't return anything. thanx for reply. "John Welch" <jwelch (AT) fred (DOT) com> wrote in message news:da1t6401riv (AT) enews4 (DOT) newsguy.com... Do you have any experience with visual basic? If so, you could do at least a couple different things: 1) you could create your own routine to generate the ID value so that you don't have to use an autonumber field, and then you could insert into each table with your ID value. 2) you could use vb to insert the fields into the Accounts table, then read the ID of the newly inserted ID value, then insert that ID into the Members table. "Carl" <mail2carl (AT) _remove_yahoo (DOT) com> wrote in message news:MtZwe.13254$11.3650 (AT) newsfe2-win (DOT) ntli.net... Hi, I hope someone can share some of their professional advice and help me out with my embarissing problem concerning an Access INSERT query. I have never attempted to create a table with one-to-one relationship but on this occasion I must keep username/password details within a seperate table. Here's the basic specs and database schema: ------------------------------------------- Database: Basic MS Access 2000 MDB Table Relationships: Both tables are joined one-to-one on their ID fields. TableMembers ID: Long Integer; Required; Indexed(Unique); PrimaryKey; Firstname: Text 50; Required; Lastname: Text 50; Required; Telephone: Text 50; Required; TableAccounts ID: AutoNumber; Required; Indexed(Unique); PrimaryKey; Username: Text 50; Required; Password: Text 50; Required; The problem: ------------ In an ideal world I would like to use a single SQL INSERT on both tables to insert the required data. But I know this isn't possible as INSERT works on single tables only, right ? I cannot use an SQL INSERT on TableMembers as the ID field is created by the AutoNumber in TableAccounts.ID. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? When I open the TableAccounts Table in Access, I can manually input all data for both Tables without any problems. TableMembers Fields are displayed as a dropdown record from TableAccounts and the ID field is automatically taken care of. Can Anyone here can offer some advice or solutions, all replies greatly appreciated. Carl. |
#9
| |||
| |||
|
|
"Carl" wrote First, unless you have beaucoup data fields that you didn't list, why would you want to have these two tables with a one-to-one relationship? Obviously the simplest, easiest solution is to include all the information in a single table and you don't have to worry about matching keys. I could INSERT into TableAccounts first, which would auto-create the ID, but how do I use the ID in the second SQL INSERT on TableMembers ??? Retrieve the record you just entered*, and create the INSERT SQL with code, using that value for the key field just as you use values for any other field. * this may not be as easy as it seems, which may be a good argument, in some cases, for using a "natural key" rather than using AutoNumber as a surrogate key. Larry Linson Microsoft Access MVP |
![]() |
| Thread Tools | |
| Display Modes | |
| |