227
Creating Database Tables
mysql> grant select, insert, update, delete, index, alter, create, drop
-> on books.*
-> to bookorama identified by ‘bookorama123’;
Go ahead and set up this second version of the user because you need to use it in the
next section.
Logging Out as root
You can log out of the MySQL monitor by typing 
quit
.You should log back in as your
web user to test that everything is working correctly.If the 
GRANT
statement that you ran
was executed,but you are denied access when trying to log in,this usually means you
have not deleted the anonymous users as part of the installation process.Log back in as
root
and consult Appendix A for instructions on how to delete the anonymous
accounts.You should then be able to log in as the web user.
Using the Right Database
If you’ve reached this stage, you should be logged in to a user-level MySQL account
ready to test the sample code, either because you’ve just set it up or because your web
server administrator has set it up for you.
The first step you need to take when you log in is to specify which database you
want to use.You can do this by typing
mysql> use dbname;
where 
dbname
is the name of your database.
Alternatively,you can avoid the 
use
command by specifying the database when you
log in,as follows:
mysql -D dbname -h hostname -u username -p
In this example,you can use the 
books
database:
mysql> use books;
When you type this command,MySQL should give you a response such as
Database changed
If you don’t select a database before starting work,MySQL will give you an error mes-
sage such as
ERROR 1046 (3D000): No Database Selected
Creating Database Tables
The next step in setting up the database is to actually create the tables.You can do this 
using the SQL command 
CREATE TABLE
.The general form of a 
CREATE TABLE
statement is
CREATE TABLE tablename(columns)
Pdf editable fields - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
add jpg to pdf form; pdf form creator
Pdf editable fields - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
chrome pdf save form data; best pdf form creator
228
Chapter 9 Creating Your Web Database
You should replace the 
tablename
placeholder with the name of the table you want to
create and the 
columns
placeholder with a comma-separated list of the columns in your
table.Each column will have a name followed by a data type.
Here’s the Book-O-Rama schema again:
Customers(CustomerID
, Name, Address, City)
Orders(OrderID
, CustomerID, Amount, Date)
Books(ISBN
, Author, Title, Price)
Order_Items(OrderID
, ISBN
, Quantity)
Book_Reviews(ISBN
, Reviews)
Listing 9.1 shows the SQL to create these tables, assuming you have already created the
database called 
books
.You can find this SQL in the file 
chapter9/bookorama.sql
on
the CD-ROM accompanying this book.
You can run an existing SQL file,such as one loaded from the CD-ROM,through
MySQL by typing
> mysql -h host -u bookorama -D books -p < bookorama.sql
(Remember to replace 
host
with the name of your host.)
Using file redirection is handy for this task because it means that you can edit your
SQL in the text editor of your choice before executing it.
Listing 9.1 bookorama.sql—SQL to Create the Tables for Book-O-Rama
create table customers
( customerid int unsigned not null auto_increment primary key,
name char(50) not null,
address char(100) not null,
city char(30) not null
);
create table orders
( orderid int unsigned not null auto_increment primary key,
customerid int unsigned not null,
amount float(6,2),
date date not null
);
create table books
(  isbn char(13) not null primary key,
author char(50),
C# PDF Convert to Text SDK: Convert PDF to txt files in C#.net
NET project. Powerful .NET control for batch converting PDF to editable & searchable text formats in C# class. Free evaluation library
add an image to a pdf form; build pdf forms
C# Create PDF Library SDK to convert PDF from other file formats
Create and save editable PDF with a blank page, bookmarks, links, signatures, etc. Create fillable PDF document with fields. Load
pdf form save in reader; change font size in pdf fillable form
229
Creating Database Tables
title char(100),
price float(4,2)
);
create table order_items
( orderid int unsigned not null,
isbn char(13) not null,
quantity tinyint unsigned,
primary key (orderid, isbn)
);
create table book_reviews
(
isbn char(13) not null primary key,
review text
);
Each table is created by a separate 
CREATE TABLE
statement.You can see that each table
in the schema is created with the columns designed in the preceding chapter.Each col-
umn has a data type listed after its name, and some of the columns have other specifiers,
too.
Understanding What the Other Keywords Mean
NOT NULL
means that all the rows in the table must have a value in this attribute.If it
isn’t specified, the field can be blank (
NULL
).
AUTO_INCREMENT
is a special MySQL feature you can use on integer columns.It
means if you leave that field blank when inserting rows into the table,MySQL will auto-
matically generate a unique identifier value.The value will be one greater than the maxi-
mum value in the column already.You can have only one of these in each table.
Columns that specify 
AUTO_INCREMENT
must be indexed.
PRIMARY KEY
after a column name specifies that this column is the primary key for
the table. Entries in this column have to be unique.MySQL automatically indexes this
column.Where it is used with 
customerid
in the 
customers
table in Listing 9.1, it
appears with 
AUTO_INCREMENT
.The automatic index on the primary key takes care of the
index required by 
AUTO_INCREMENT
.
You can specify 
PRIMARY KEY
after a column name only for single column primary
keys.The 
PRIMARY KEY
clause at the end of the 
order_items
statement is an alternative
form.We used it here because the primary key for this table consists of the two columns
together.(This also creates an index based on the two columns together.)
UNSIGNED
after an integer type means that it can have only a zero or positive value.
Listing 9.1 Continued
C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
hardly edit PDF document. Under this situation, you need to convert PDF document to some easily editable files like Word document.
pdf form creator; add form fields to pdf
VB.NET PDF Convert to Text SDK: Convert PDF to txt files in vb.net
Text in any PDF fields can be copied and pasted to .txt files by keeping original layout. VB.NET control for batch converting PDF to editable & searchable text
pdf editable fields; add fillable fields to pdf online
230
Chapter 9 Creating Your Web Database
Understanding the Column Types
Let’s consider the first table as an example:
create table customers
( customerid int unsigned not null auto_increment primary key,
name char(50) not null,
address char(100) not null,
city char(30) not null
);
When creating any table,you need to make decisions about column types.
The 
customers
table has four columns as specified in the schema.The first one,
customerid
,is the primary key,which is specified directly.We decided this will be an
integer (data type 
int
) and that these IDs should be 
unsigned
.We’ve also taken advan-
tage of the 
auto_increment
facility so that MySQL can manage them for us;it’s one less
thing to worry about.
The other columns are all going to hold string type data.We chose the 
char
type for
them.This type specifies fixed-width fields.The width is specified in the brackets,so,for
example,
name
can have up to 50 characters.
This data type will always allocate 50 characters of storage for the name, even if
they’re not all used.MySQL will pad the data with spaces to make it the right size.The
alternative is 
varchar
,which uses only the amount of storage required (plus one byte).
There is a small trade-off:
varchar
s use less space on average,but 
char
s are faster.
Note that all the columns are declared as 
NOT NULL
.This is a minor optimization you
can make wherever possible that also will make things run a bit faster.We address opti-
mization in more detail in Chapter 12.
Some of the other 
CREATE
statements have variations in syntax.Let’s look at the
orders
table:
create table orders
( orderid int unsigned not null auto_increment primary key,
customerid int unsigned not null,
amount float(6,2) ,
date date not null
);
The 
amount
column is specified as a floating-point number of type 
float
.With most
floating-point data types,you can specify the display width and the number of decimal
places.In this case,the order amount will be in dollars,so we allowed a reasonably large
order total (width 6) and two decimal places for the cents.
The 
date
column has the data type 
date
.
This particular table specifies that all columns bar the amount as 
NOT NULL
.Why?
When an order is entered into the database, you need to create it in orders,add the
items to 
order_items
,and then work out the amount.You might not know the amount
when the order is created,so you can allow for it to be 
NULL
.
VB.NET Create PDF Library SDK to convert PDF from other file
Create and save editable PDF with a blank page, bookmarks, links, signatures, etc. Create fillable PDF document with fields in Visual Basic .NET application.
chrome save pdf with fields; change font size in fillable pdf form
VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to
to PDF; VB.NET Protect: Add Password to PDF; VB.NET Form: extract value from fields; Convert multiple pages PowerPoint to fillable and editable PDF documents.
pdf form creation; add picture to pdf form
231
Creating Database Tables
The 
books
table has some similar characteristics:
create table books
(  isbn char(13) not null primary key,
author char(50),
title char(100),
price float(4,2)
);
In this case,you don’t need to generate the primary key because ISBNs are generated
elsewhere.The other fields are left as 
NULL
because a bookstore might know the ISBN of
a book before it knows the 
title
,
author
,or 
price
.
The 
order_items
table demonstrates how to create multicolumn primary keys:
create table order_items
( orderid int unsigned not null,
isbn char(13) not null,
quantity tinyint unsigned,
primary key (orderid, isbn)
);
This table specifies the quantity of a particular book as a 
TINYINT UNSIGNED
,which
holds an integer between 0 and 255.
As mentioned previously,multicolumn primary keys need to be specified with a spe-
cial primary key clause.This clause is used here.
Lastly,consider the 
book_reviews
table:
create table book_reviews
(
isbn char(13) not null primary key,
review text
);
This table uses a new data type,
text
,which we have not yet discussed. It is used for
longer text,such as an article.There are a few variants on this,which we discuss later in
this chapter.
To understand creating tables in more detail,let’s discuss column names and identifiers
in general and then the data types we can choose for columns.First,though,let’s look at
the database we’ve created.
Looking at the Database with SHOW and DESCRIBE
Log in to the MySQL monitor and use the 
books
database.You can view the tables in
the database by typing
mysql> show tables;
VB.NET Create PDF from Word Library to convert docx, doc to PDF in
Add Image to PDF; VB.NET Protect: Add Password to PDF; VB.NET Form: extract value from fields; Convert multiple pages Word to fillable and editable PDF documents
pdf create fillable form; add jpg to pdf form
VB.NET Create PDF from Excel Library to convert xlsx, xls to PDF
PDF; VB.NET Protect: Add Password to PDF; VB.NET Form: extract value from fields; Create fillable and editable PDF documents from Excel in Visual Basic .NET class
create a form in pdf from word; adding text field to pdf
232
Chapter 9 Creating Your Web Database
MySQL then displays a list of all the tables in the database:
+-----------------+
| Tables in books |
+-----------------+
| book_reviews    |
| books           |
| customers       |
| order_items     |
| orders          |
+-----------------+
5 rows in set (0.06 sec)
You can also use 
show
to see a list of databases by typing
mysql> show databases;
If you do not have the 
SHOW DATABASES
privilege,you will see listed only the databases
on which you have privileges.
You can see more information about a particular table,for example,
books
,using
DESCRIBE
:
mysql> describe books;
MySQL then displays the information you supplied when creating the database:
+--------+------------+------+-----+---------+-------+
| Field  | Type       | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| isbn   | char(13)   |      | PRI |         |       |
| author | char(50)   | YES  |     | NULL    |       |
| title  | char(100)  | YES  |     | NULL    |       |
| price  | float(4,2) | YES  |     | NULL    |       |
+--------+------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
These commands are useful to remind yourself of a column type or to navigate a data-
base that you didn’t create.
Creating Indexes
We briefly mentioned indexes already,because designating primary keys creates indexes
on those columns.
One common problem faced by new MySQL users is that they complain about poor
performance from this database they have heard is lightning fast.This performance prob-
lem occurs because they have not created any indexes on their database. (It is possible to
create tables with no primary keys or indexes.)
VB.NET PDF Convert to Word SDK: Convert PDF to Word library in vb.
NET control to export Word from multiple PDF files in VB. Create editable Word file online without email. Supports transfer from password protected PDF.
change font size in pdf form field; change font pdf form
233
Understanding MySQL Identifiers
To begin with,the indexes that were created automatically for you will do.If you find
that you are running many queries on a column that is not a key,you may want to add
an index on that column to improve performance.You can do this with the 
CREATE
INDEX
statement.The general form of this statement is
CREATE [UNIQUE|FULLTEXT] INDEX index_name
ON table_name (index_column_name [(length)] [ASC|DESC], ...])
(
FULLTEXT
indexes are for indexing text fields;we discuss their use in Chapter 13,
“Advanced MySQL Programming.”)
The optional 
length
field allows you to specify that only the first 
length
characters
of the field will be indexed.You can also specify that an index should be ascending (
ASC
)
or descending (
DESC
);the default is ascending.
A Note on Table Types
You may be aware that MySQL offers more than one table type or storage engine,
including some transaction-safe types.We discuss the table types in Chapter 13.At pres-
ent,all the tables in the database use the default storage engine,MyISAM.
Understanding MySQL Identifiers
Five kinds of identifiers are used in MySQL:databases,tables,columns,and indexes,
which you’re already familiar with;and aliases, which we cover in the next chapter.
Databases in MySQL map to directories in the underlying file structure,and tables
map to files.This mapping has a direct effect on the names you can give them.It also
affects the case sensitivity of these names: If directory and filenames are case sensitive in
your operating system,database and table names will be case sensitive (for example,in
Unix);otherwise,they won’t (for example,under Windows).Column names and alias
names are not case sensitive,but you can’t use versions of different cases in the same
SQL statement.
As a side note,the location of the directory and files containing the data is wherever
it was set in configuration.You can check the location on your system by using the
mysqladmin
facility as follows:
mysqladmin variables
Then look for the 
datadir
variable.
A summary of possible identifiers is shown in Table 9.4.The only additional excep-
tion is that you cannot use ASCII(0),ASCII(255),or the quoting character in identifiers
(and to be honest, we’re not sure why you would want to).
234
Chapter 9 Creating Your Web Database
Table 9.4 MySQL Identifiers
Type
Max
Case
Characters
Length
Sensitive?
Allowed
Database
64
same as OS
Anything allowed in a directory name in your
OS except the 
/
,
\
,and 
.
characters
Table
64
same as OS
Anything allowed in a filename in your OS
except the 
/
and 
.
characters
Column
64
no
Anything
Index
64
no
Anything
Alias
255
no
Anything
These rules are extremely open.
Since MySQL 3.23.6, you can even have reserved words and special characters of all
kinds in identifiers.The only limitation is that if you use anything unusual like this,you
have to put it in backticks (located under the tilde key on the top left of most key-
boards).For example,
create database `create database`;
The rules in versions of MySQL (prior to 3.23.6) are more restrictive and don’t allow
you to do this.
Of course,you should apply common sense to all this freedom.Just because you can
call a database 
`create database`
doesn’t that mean that you should.The same princi-
ple applies here as in any other kind of programming: Use meaningful identifiers.
Choosing Column Data Types
The three basic column types in MySQL are numeric, date and time,and string.Within
each of these categories are a large number of types.We summarize them here and go
into more detail about the strengths and weaknesses of each in Chapter 12.
Each of the three types comes in various storage sizes.When you are choosing a col-
umn type,the principle is generally to choose the smallest type that your data will fit
into.
For many data types, when you are creating a column of that type,you can specify
the maximum display length.This is shown in the following tables of data types as 
M
.If
it’s optional for that type,it is shown in square brackets.The maximum value you can
specify for 
M
is 255.
Optional values throughout these descriptions are shown in square brackets.
235
Choosing Column Data Types
Numeric Types
The numeric types are either integers or floating-point numbers.For the floating-point
numbers,you can specify the number of digits after the decimal place.This value is
shown in this book as 
D
.The maximum value you can specify for 
D
is 30 or 
M-2
(that is,
the maximum display length minus two—one character for a decimal point and one for
the integral part of the number),whichever is lower.
For integer types,you can also specify whether you want them to be 
UNSIGNED
,as
shown in Listing 9.1.
For all numeric types, you can also specify the 
ZEROFILL
attribute.When values from
ZEROFILL
column are displayed,they are padded with leading zeros.If you specify a
column as 
ZEROFILL
,it will automatically also be 
UNSIGNED
.
The integral types are shown in Table 9.5.Note that the ranges listed in this table
show the signed range on one line and the unsigned range on the next.
Table 9.5 Integral Data Types
Type
Range
Storage
Description
(Bytes)
TINYINT[(M)]
–127..128
1
Very small integers
or 0..255
BIT
Synonym for 
TINYINT
BOOL
Synonym for 
TINYINT
SMALLINT[(M)]
–32768..32767
2
Small integers
or 0..65535
MEDIUMINT[(M)]
–8388608..
3
Medium-sized integers
8388607
or 0..16777215
INT[(M)]
–231..231 –1
4
Regular integers
or 0..232 –1
INTEGER[(M)]
Synonym for 
INT
BIGINT[(M)]
–263..263 –1
8
Big integers
or 0..264 –1
The floating-point types are shown in Table 9.6.
Table 9.6 Floating-Point Data Types
Type
Range
Storage
Description
(bytes)
FLOAT(precision)
Depends on
Varies
Can be used to specify
precision
single or double precision
floating-point numbers.
236
Chapter 9 Creating Your Web Database
FLOAT[(M,D)]
±1.175494351E-38
4
Single precision floating-
±3.402823466E+38
point number.These 
numbers are equivalent to
FLOAT(4)
but with a 
specified display width 
and number of decimal 
places.
DOUBLE[(M,D)]
±1.
8
Double precision floating-
7976931348623157E
point number.These 
+308
numbers are equivalent 
±2.2250738585072014E
to 
FLOAT(8)
but with a 
-308
specified display width 
and number of decimal 
places.
DOUBLE
Synonym for
PRECISION[(M,D)]
As above
DOUBLE[(M, D)]
.
REAL[(M,D)]
As above
Synonym for 
DOUBLE[(M, D)]
.
DECIMAL[(M[,D])]
Varies
M+2
Floating-point number
stored as 
char
.The range
depends on 
M
,the display
width.
NUMERIC[(M,D)]
As above
Synonym for 
DECIMAL
.
DEC[(M,D)]
As above
Synonym for 
DECIMAL
.
FIXED[(M,D)]
As above
Synonym for 
DECIMAL
.
Date and Time Types
MySQL supports a number of date and time types;they are shown in Table 9.7.With all
these types,you can input data in either a string or numerical format. It is worth noting
that a 
TIMESTAMP
column in a particular row will be set to the date and time of the most
recent operation on that row if you don’t set it manually.This feature is useful for trans-
action recording.
Table 9.6 Continued
Type
Range
Storage
Description
(bytes)
Documents you may be interested
Documents you may be interested