Объединения, внешние ключи и первичные ключи - все тесно связанные понятия в реляционной базе данных.
Первичный ключ однозначно идентифицирует строки в данной таблице.
Внешний внешний ключ обозначает первичный ключ в другой таблице .
A Join - это способ извлечения данных из нескольких таблиц.
Я не очень часто использовал SQL Workbench, но я предполагаю, что таблица ссылок ссылается на таблицу, содержащую несколько внешних ключей , чтобы создать отношение «многие ко многим» между двумя таблицами. [1122 ]
Например:
Таблица User
CREATE TABLE User(
userId INT PRIMARY KEY,
username VARCHAR(40)
);
Таблица Post
CREATE TABLE Post(
postId INT PRIMARY KEY,
postContents VARCHAR(max)
);
Таблица UserPost
CREATE TABLE UserPost(
userId INT FOREIGN KEY REFERENCES User(userId),
postId INT FOREIGN KEY REFERENCES Post(postId)
);
[1127 ] Таблица UserPost
будет «таблицей ссылок», которая связывает вместе таблицы User
и Post
, чтобы указать, сколько сообщений может иметь любой пользователь.
Затем вы можете найти все сообщения данного пользователя с SQL-запросом, как показано ниже, используя ссылки UserPost
- вместе User
и Post
SELECT u.username, p.postContents FROM User u
JOIN UserPost up ON up.userId = u.userId
JOIN Post p ON up.postId = p.postId
Так Таким образом, таблица ссылок позволяет нам использовать объединения для объединения информации из нескольких таблиц. Из-за этого таблицы ссылок чаще называют «таблицами соединений». См. этот пост для более подробной информации о таблицах соединения.
Я предлагаю простое, но хорошо работающее решение, обнаруженное мной;)
Что мне делать?
Протестировано с последней версией JDK 6 под Linux (OpenSuse, KDE3),
но послушайте, это Java Swing, он должен работать одинаково везде.
Вот код:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class MyDraggableComponent
extends JComponent {
private volatile int screenX = 0;
private volatile int screenY = 0;
private volatile int myX = 0;
private volatile int myY = 0;
public MyDraggableComponent() {
setBorder(new LineBorder(Color.BLUE, 3));
setBackground(Color.WHITE);
setBounds(0, 0, 100, 100);
setOpaque(false);
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) {
screenX = e.getXOnScreen();
screenY = e.getYOnScreen();
myX = getX();
myY = getY();
}
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
});
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
int deltaX = e.getXOnScreen() - screenX;
int deltaY = e.getYOnScreen() - screenY;
setLocation(myX + deltaX, myY + deltaY);
}
@Override
public void mouseMoved(MouseEvent e) { }
});
}
}
public class Main {
public static void main(String[] args) {
JFrame f = new JFrame("Swing Hello World");
// by doing this, we prevent Swing from resizing
// our nice component
f.setLayout(null);
MyDraggableComponent mc = new MyDraggableComponent();
f.add(mc);
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);
}
}
Кроме того, я обнаружил, что можно создать JInternalFrame внутри JFrame, но проблема в том, что вы всегда получаете раздражающую строку заголовка окна .
К сожалению, чтобы отключить строку заголовка, необходим грязный обходной путь :
public class MyDraggableComponent extends JInternalFrame {
public MyDraggableComponent() {
InternalFrameUI thisUI = getUI();
if (thisUI instanceof BasicInternalFrameUI) {
((BasicInternalFrameUI) thisUI).setNorthPane(null);
}
}
Я действительно скучаю по метод типа "someInternalFrame.setWindowTitleBar (false)" ...
: '(